Objective c 为什么我的数组保持为空?

Objective c 为什么我的数组保持为空?,objective-c,cocoa,Objective C,Cocoa,嗨,我是一个傻瓜。我在用对象填充NSMutableArray时遇到问题 for(id p in tmpArray){ Person *person = [[Person alloc] init]; person.usrName = p; [persons addObject:person]; // after this line the persons // array is still empty

嗨,我是一个傻瓜。我在用对象填充NSMutableArray时遇到问题

for(id p in tmpArray){
    Person *person = [[Person alloc] init];
    person.usrName = p;
    [persons addObject:person]; // after this line the persons
                                // array is still empty
    [person release];
}

Persons是一个属性NSMutableArray,问题是它是空的。是因为person对象的释放太早还是我实例化它时出错了?

在尝试向数组中添加内容之前,请确保已分配并初始化数组

在尝试向数组中添加内容之前,请确保已分配并初始化数组

您需要使用
-init
方法初始化数组,像这样:

NSMutableArray *array = [[NSMutableArray alloc] init];
self.persons = array; // will be automatically retained 
                      // because you're using the property
[array release]; // we alloced - we release it
别忘了发布它:

-(void)dealloc {
     self.persons = nil; // previous value of property 'persons' will be released
     [super dealloc];
}

您需要在
-init
方法中初始化数组,如下所示:

NSMutableArray *array = [[NSMutableArray alloc] init];
self.persons = array; // will be automatically retained 
                      // because you're using the property
[array release]; // we alloced - we release it
别忘了发布它:

-(void)dealloc {
     self.persons = nil; // previous value of property 'persons' will be released
     [super dealloc];
}


如何检查数组是否为空?您是如何初始化persons数组的?根据给定的信息,您只能猜测。我猜:这段代码是一个实例的一部分,该实例具有
@property NSMutableArray*persons
。要么您不在-init中初始化数组,要么您应该使用
self.persons
而不是
persons
。我想如果您将数组设置为这样的属性,您就不必初始化它了@财产(非原子,保留)NSMutableArray*人;那是错误的。运行时如何知道如何初始化对象?objective-c参考中没有提到+alloc或-init。(不是100%确定+alloc)这两种方法纯粹是可可。您必须添加
self.persons=[NSMutableArray]
到您的init方法。不要使用
init
dealloc
中的属性。自定义访问器(在类中、子类中或超类中)可能会产生副作用,如果发生在半初始化或半释放的对象中,则会非常糟糕。正确的初始化(在
init
方法中)是
persons=[[NSMutableArray alloc]init]。如何检查数组是否为空?您是如何初始化persons数组的?根据给定的信息,您只能猜测。我猜:这段代码是一个实例的一部分,该实例具有
@property NSMutableArray*persons
。要么您不在-init中初始化数组,要么您应该使用
self.persons
而不是
persons
。我想如果您将数组设置为这样的属性,您就不必初始化它了@财产(非原子,保留)NSMutableArray*人;那是错误的。运行时如何知道如何初始化对象?objective-c参考中没有提到+alloc或-init。(不是100%确定+alloc)这两种方法纯粹是可可。您必须添加
self.persons=[NSMutableArray]
到您的init方法。不要使用
init
dealloc
中的属性。自定义访问器(在类中、子类中或超类中)可能会产生副作用,如果发生在半初始化或半释放的对象中,则会非常糟糕。正确的初始化(在
init
方法中)是
persons=[[NSMutableArray alloc]init]
。请补充,有些人使用
persons=[[NSMutableArray alloc]init]
[persons release]
。这是因为访问器可能有副作用,因此不应用于构造和解构。查看Mike Ash的博客以了解讨论:如果你的应用程序被垃圾收集,那么
dealloc
方法是不必要的。(如果代码在非gc环境中使用,仍然很好。)谢谢,@gs。我把代码改成了我以前写的东西——不知何故,我更喜欢显式alloc/init/release而不是autorelease对象。Adam Woś:这并不能解决仍然在
init
dealloc
中使用属性访问的问题。有关为什么这是一个等待发生的bug的更多细节,请参阅我对这个问题的评论。@Peter:这是事实,已经很长时间了,但这种情况正在发生越来越多的变化。在init和dealloc中使用访问器非常方便。看到我之前链接到的那篇博文:Georg:是的,这很方便,但仍然有风险,特别是在添加子类时,因为它们可能会覆盖以前安全的访问器,并使它们成为派生属性。我看不出有什么变化;访问器现在没有比以往任何时候都更安全的保证。合成访问器应该是安全的,但子类可能会覆盖这些访问器。请补充,有些人使用
persons=[[NSMutableArray alloc]init]
[persons release]
。这是因为访问器可能有副作用,因此不应用于构造和解构。查看Mike Ash的博客以了解讨论:如果你的应用程序被垃圾收集,那么
dealloc
方法是不必要的。(如果代码在非gc环境中使用,仍然很好。)谢谢,@gs。我把代码改成了我以前写的东西——不知何故,我更喜欢显式alloc/init/release而不是autorelease对象。Adam Woś:这并不能解决仍然在
init
dealloc
中使用属性访问的问题。有关为什么这是一个等待发生的bug的更多细节,请参阅我对这个问题的评论。@Peter:这是事实,已经很长时间了,但这种情况正在发生越来越多的变化。在init和dealloc中使用访问器非常方便。看到我之前链接到的那篇博文:Georg:是的,这很方便,但仍然有风险,特别是在添加子类时,因为它们可能会覆盖以前安全的访问器,并使它们成为派生属性。我看不出有什么变化;访问器现在没有比以往任何时候都更安全的保证。合成的访问器应该是安全的,但子类可能会覆盖这些访问器。