我有关于在Objective-C中分配属性的以下问题,
如果我有以下属性:
@property (nonatomic, retain) NSArray *arr;
@synthize arr=_arr;
我应该像这样分配这个数组:
arr=[[NSArray alloc]init];
如果我应该,分配它的最佳位置在哪里?
我知道我应该释放它,但保留一个属性会使其保留计数增加1,分配它会使其增加1,我是对的。
答案 0 :(得分:5)
您可以通过两种方式分配数组:
使用保留值直接设置ivar,如下所示:
_arr = [[NSArray alloc] init];
使用自动释放的值设置属性,如下所示:
self.arr = [NSArray array];
你可以在类的init方法中执行此操作,虽然你没有说过它使用的是什么超类,所以我不确定init方法应该如何。如果它是NSObject,它将如下所示:
- (id)init
{
if ((self = [super init]))
{
self.arr = [NSArray array];
}
return self;
}
但是如果它是一个UIViewController,你需要使用initWithNibName:bundle,就像这样:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)bundleOrNil
{
if ((self = [super itWithNibName:nibNameOrNil bundle:bundleOrNil]))
{
self.arr = [NSArray array];
}
return self;
}
然后你需要在你的dealloc方法中释放它,如下所示:
- (void)dealloc
{
[_arr release];
[super dealloc];
}
但是,你应该记住NSArrays一旦创建就无法更改,所以你可能要么想用一些对象初始化它,比如:
self.arr = [NSArray arrayWithObjects:object1, object2, nil];
或者如果您想稍后向其添加对象,您应该将其定义为NSMutableArray,如下所示:
@property (nonatomic, retain) NSMutableArray *arr;
并使用以下命令启动它:
self.arr = [NSMutableArray array];
这将允许您稍后添加对象。
顺便说一句,如果你的dealloc方法出错,这可能意味着你的项目正在使用ARC,这是iOS 5中的一项新技术,这意味着你不再需要编写发布和保留语句。
如果您不使用ARC,我建议您这样做,因为它可以节省您不必担心这个保留/发布的东西 - 任何刚开始的iOS开发人员都应该为每个项目使用ARC,但因为它仅在iOS 5中引入,很多Objective-C书籍都没有涵盖它。