所以我有这个代码,但它不起作用:
for (NSDictionary *item in data){
[self.resultsArray addObject:item];
}
self.resultsArray是零。但后来我改为:
NSMutableArray *myDataArray = [[NSMutableArray alloc] init];
for (NSDictionary *item in data){
[myDataArray addObject:item];
}
self.resultsArray = myDataArray;
[myDataArray release];
现在它奏效了。 self.resultsArray现已填充
所以我是Objective C的初学者,我想知道为什么我不能直接在属性的addObject中使用它。为什么我必须创建另一个可变数组,填充它,将它分配给resultsArray属性并释放我制作的可变数组?
提前致谢!
编辑:此外,在我一直在努力的很多书中,这已经做了很多。
答案 0 :(得分:3)
简单回答
在向对象添加对象之前,您没有初始化self.resultArray
。它只是一个指向值的指针,直到你alloc
它为止。
self.resultArray = [[NSMutableArray alloc] init];
将解决问题。
然而,这种分配方式会造成内存泄漏,因此书籍和示例中没有显示。如果self.resultArray
属性标记为retain
,并且通过调用alloc,它将被保留2次,就会发生内存泄漏。
答案 1 :(得分:1)
如果self.resultsArray
为零,则[self.resultsArray addObject:item]
不将对象添加到数组中,它将不执行任何操作(因为数组将为nil
默认情况下,向nil
发送消息是Objective-C中的无操作。当您将可变数组创建为局部变量时,可以向其添加内容 - 然后,如果将其分配给属性,那么一切都按预期工作,self.resultsArray
将不再为零。
通常当您拥有这样的属性时,您可以在init方法中设置它们:
- (id)init {
// ...
self.resultsArray = [NSMutableArray array];
// or access the ivar directly:
// _resultsArray = [[NSMutableArray alloc] init];
// ...
}
然后,只要您的对象初始化,您就可以向数组中添加内容。同样,如果您不这样做,默认情况下它将是nil
,[self.resultsArray addObject:item]
将无效。
答案 2 :(得分:1)
你可能没有初始化数组(我将假设myDataArray是一个NSMutableArray)。
在您的init方法中,调用myDataArray = [NSMutableArray array];
并且它将正常工作
答案 3 :(得分:1)
需要注意的重要一点是,您没有创建 另一个 可变数组,因为您没有可以开始的数组。仅仅声明属性或变量不会创建与其一起使用的对象。这就是为什么self.resultsArray以 nil 开始。
您拥有的工作代码旨在允许您在保留数组时显式释放数组:一次分配时,一次分配给您的属性。您只需要其中一个保留,因此您只需发布一次。
你可以这样做:
self.resultsArray = [[NSMutableArray alloc] init];
[self.resultsArray release];
for (NSDictionary *item in data){
[self.resultsArray addObject:item];
}
这是更少的代码,但它不是那么清楚。清晰度很重要。