Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么我必须创建一个对象并将其指定给目标C中的属性?_Objective C_Ios - Fatal编程技术网

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]