Objective c 为什么我必须创建一个对象并将其指定给目标C中的属性?
所以我有这个代码,但它不起作用:Objective c 为什么我必须创建一个对象并将其指定给目标C中的属性?,objective-c,ios,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:ite
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属性并释放我创建的可变数组
提前谢谢
编辑:同样,在我一直在写的很多书中,这都做了很多。如果
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]
将无效。如果self.resultsArray
为nil,那么[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]
将无效。很可能你没有初始化数组(我假设myDataArray是一个NSMutableArray)
在init方法中,调用
myDataArray=[NSMutableArray];
它就会工作很可能您没有初始化数组(我假设myDataArray是一个NSMutableArray)
在您的init方法中,调用myDataArray=[NSMutableArray];
,它将工作简单回答
在向self.resultaray添加对象之前,您没有初始化它。它只是一个指向值的指针,在alloc
之前,该值为零
self.resultArray=[[NSMutableArray alloc]init];
在向其添加对象之前将解决此问题
但是,这种分配方式会产生内存泄漏,因此未在书籍和示例中显示。如果self.resultaray
属性标记为retain
,则会发生内存泄漏,通过调用alloc,它将被保留2次。简单回答
在向self.resultaray添加对象之前,您没有初始化它。它只是一个指向值的指针,在alloc
之前,该值为零
self.resultArray=[[NSMutableArray alloc]init];
在向其添加对象之前将解决此问题
但是,这种分配方式会产生内存泄漏,因此在书籍和示例中没有显示。如果
self.resultaray
属性标记为retain
,则会发生内存泄漏,并且通过调用alloc,它将被保留2次。需要注意的重要一点是,您没有创建另一个可变数组,因为您没有数组作为开始。仅声明属性或变量并不会创建一个与之配套的对象。这就是self.resultsArray以nil开头的原因
您拥有的工作代码旨在允许您在保留数组两次时显式释放数组:一次是在分配数组时,一次是在将其分配给属性时。您只需要一次保留,因此释放一次
你可以这样做:
self.resultsArray = [[NSMutableArray alloc] init];
[self.resultsArray release];
for (NSDictionary *item in data){
[self.resultsArray addObject:item];
}
代码较少,但不够清晰。清晰性很重要。需要注意的重要一点是,您没有创建另一个易变数组,因为您没有数组开始。仅声明属性或变量并不能创建一个对象。这就是self.resultsArray开始时为零的原因 您拥有的工作代码旨在允许您在保留数组两次时显式释放数组:一次是在分配数组时,一次是在将其分配给属性时。您只需要一次保留,因此释放一次 你可以这样做:
self.resultsArray = [[NSMutableArray alloc] init];
[self.resultsArray release];
for (NSDictionary *item in data){
[self.resultsArray addObject:item];
}
这是更少的代码,但它不是那么清晰。清晰性很重要。我明白了。谢谢。我读了很多书,我注意到他们总是像我在代码的后半部分所做的那样,而不是alloc和初始化属性。你知道为什么吗?@Ygam,我已经更新了关于这会造成内存泄漏的答案。请检查。呃,你不应该这样做必须执行self.resultArray=[[NSMutableArray alloc]init],因为就像你说的那样,泄露。看到我的答案了吗。哦,顺便问一下,对于iOS 5的ARC,我需要担心这个问题吗?@y我不确定,但你总是需要关心mem泄露。我明白了。谢谢。我读了很多书,我注意到他们总是像我在代码的后半部分那样做,而不是alloc和初始化pr属性。知道为什么吗?@Ygam,我已经更新了关于由此产生的内存泄漏的答案。请检查。呃,你永远不应该做
self.resultArray=[[NSM]