【问题标题】:NSMutableArray automatically typecasting into NSArrayNSMutableArray 自动类型转换为 NSArray
【发布时间】:2012-03-15 16:24:32
【问题描述】:

我通过

创建了一个 NSMutableArray 对象
NSMutableArray *array = [[NSMutableArray alloc]init];

和使用的方法组件SeperatedByString: as

array = [myString componentsSeperatedByString:@"++"];

但是当我对数组执行操作时,

[array removeAllObjects];

我遇到了“removeAllObjects unrecognized selector send to instance”之类的异常。

我通过修改代码解决了这个问题,

NSArray *components = [myString componentsSeperatedByString:@"++"];



array = [NSMutableArray arrayWithArray:components];

然后我可以执行类似的操作

[array removeAllObjects];

我的疑问是为什么 NSMutableArray 自动转换为 NSArray?如何避免像这样的自动类型转换,以防止异常?提前谢谢....

【问题讨论】:

  • Ninte oru 怀疑.. ..ho。 Da doudt undel ennod chodeeru。 nan parayam nan aaranennum nee arraennum..kettoda..Mundaykkal rakese..:))

标签: iphone objective-c nsmutablearray


【解决方案1】:

您对 Objective-C 工作原理的理解有误。这一行:

NSMutableArray *array = [[NSMutableArray alloc]init];

分配并初始化数组,指针array指向这个对象。现在,这一行:

array = [myString componentsSeperatedByString:@"++"];

使array 指针指向componentsSeparatedByString 方法返回的新数组。执行此操作时会丢失对分配和初始化的可变数组的引用,如果不使用 ARC,则会造成内存泄漏。

【讨论】:

    【解决方案2】:

    这是因为[myString componentsSeperatedByString:@"++"] 返回一个 NSArray。你可以试试这样:

    array = [[myString componentsSeperatedByString:@"++"] mutableCopy];
    

    array = [NSMutableArray arrayWithArray:[myString componentsSeperatedByString:@"++"]];
    

    【讨论】:

      【解决方案3】:

      这是因为– componentsSeparatedByString: 返回一个NSArrayhttps://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html#//apple_ref/occ/instm/NSString/componentsSeparatedByString

      执行以下操作:

      array = [NSMutableArray arrayWithArray:[myString componentsSeperatedByString:@"++"]];
      

      【讨论】:

        【解决方案4】:

        上线

        array = [myString componentsSeperatedByString:@"++"];
        

        你正在用一个新的NSArray 替换你分配的NSMutableArray(并泄露你的NSMutableArray。尝试使用这个:

        NSMutableArray *array = [NSMutableArray arrayWithArray:[myString componentsSeperatedByString:@"++"]];
        

        【讨论】:

          【解决方案5】:

          它没有被转换,如果你写类似的东西,数组指针可能是 UIButton*

          array = [self likeThatButton];
          

          likeThatButton 是返回 UIButton* 的方法。与目标 c 中的往常一样,NSMutableArray *array 意味着只有 Xcode 会尝试分析您的代码并建议方便的警告和代码完成。

          【讨论】:

            【解决方案6】:

            一个 NSMutableArray 实例不会被自动转换。

            方法 componentsSeperatedByString 返回一个 NSArray-Object。将返回值分配给 NSMutableArray-Pointer 时,您应该会收到编译器警告。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-06-01
              • 2011-03-14
              • 2010-12-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多