为什么我必须创建一个对象并将其分配给Objective C中的属性?

时间:2011-08-24 02:21:11

标签: objective-c ios

所以我有这个代码,但它不起作用:

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属性并释放我制作的可变数组?

提前致谢!

编辑:此外,在我一直在努力的很多书中,这已经做了很多。

4 个答案:

答案 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];
}

这是更少的代码,但它不是那么清楚。清晰度很重要。