arrayOfElements = [NSMutableArray arrayWithArray:[someObj getArray]];
和
arrayOfElements = [[NSMutableArray alloc] init];
arrayOfElements = [someObj getArray];
有什么区别?
第一个arrayOfElements
在numberOfRowsInSection:(NSInteger)section
中返回计数时似乎没有丢失其对象,但第二个{...}}。当我第二种方式时,我得到EXC_BAD_ACCESS。
修改
我现在可以假设这是最好的方法,
arrayOfElements = [[NSMutableArray alloc] initWithArray:[someObj getArray]];
因为我正在使用autorelease
'd的内容初始化一个数组,现在我在当前类中有一个完全独立的数组,即viewDidLoad
,oops抱歉,{{ 1}}。
答案 0 :(得分:2)
此行从现有数组
创建NSMutableArray
arrayOfElements = [NSMutableArray arrayWithArray:[someObj getArray]];
此组合首先创建NSMutableArray
,然后立即丢弃它,将其替换为[someObj getArray]
arrayOfElements = [[NSMutableArray alloc] init]; // Create new NSMutableArray
arrayOfElements = [someObj getArray]; // Throw away the newly created array and replace with the result of [someObj getArray]
如果您没有使用ARC,那么完全可以通过运气来实现。
在这两种情况下,arrayOfElements
都会被分配一个autorelease
' d对象 - 很快就会被清除(很可能是下一个runloop)。只是偶然的是,没有其他任何东西写在这个内存点上,这使得你的一个实现仍然可以工作。
如果您不使用ARC,那么您应该更新您的项目以便使用它将为您处理很多此类案例。
你绝对应该使用属性(不是裸ivars),因为这有助于减少内存问题(对于非ARC)并为代码提供更一致的界面。
在标题(或类扩展名)中声明属性,如此
@property (nonatomic, strong) NSMutableArray *arrayOfElements;
现在对于ARC,您可以轻松完成
[self setArrayOfElements:[[someObj getArray] mutableCopy];
对于非ARC你可以做
NSMutableArray *array = [[someObj getArray] mutableCopy];
[self setArrayOfElements:array];
[array release]; array = nil;
另请注意,getArray
是一个错误的方法名称。
除非间接返回一个或多个值,否则不必使用“get”。 Coding Guidelines
答案 1 :(得分:0)
当您从另一个数组向可变数组添加对象时,请尝试:
[arrayOfElements addObjectsFromArray: [someObj getArray]];
答案 2 :(得分:0)
如果您不使用ARC,则需要确保保留它。
if (arrayOfElements) {
[arrayOfElements release];
}
arrayOfElements = [[NSMutableArray alloc] initWithArray:[someObj getArray]];