在Objective-C中分配属性

Nid*_*aed 1 iphone xcode cocoa-touch memory-management objective-c

我有关于在Objective-C中分配属性的以下问题,

如果我有以下财产:

@property (nonatomic, retain) NSArray *arr;
@synthize arr=_arr;
Run Code Online (Sandbox Code Playgroud)

我应该像这样分配这个数组:

arr=[[NSArray alloc]init];
Run Code Online (Sandbox Code Playgroud)

如果我愿意,分配它的最佳位置在哪里?

我知道我应该释放它,但是保留一个属性会使其保留计数增加1并且分配它会使它增加1,我是对的.

Nic*_*ood 5

您可以通过两种方式分配数组:

  1. 直接使用保留值设置ivar,如下所示:

    _arr = [[NSArray alloc] init];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用如下自动释放值设置属性:

    self.arr = [NSArray array];
    
    Run Code Online (Sandbox Code Playgroud)

您可以在类的init方法中执行此操作,虽然您没有说明它使用的是哪个超类,所以我不确定init方法应该如何.如果是NSObject,它将如下所示:

- (id)init
{
    if ((self = [super init]))
    {
         self.arr = [NSArray array];
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

但如果它是一个UIViewController,你需要使用initWithNibName:bundle,如下所示:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)bundleOrNil
{
    if ((self = [super itWithNibName:nibNameOrNil bundle:bundleOrNil]))
    {
         self.arr = [NSArray array];
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

然后你需要在dealloc方法中释放它,如下所示:

- (void)dealloc
{
    [_arr release];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

但是,您应该记住NSArrays一旦创建就无法更改,因此您可能要么使用某些对象初始化它,如下所示:

self.arr = [NSArray arrayWithObjects:object1, object2, nil];
Run Code Online (Sandbox Code Playgroud)

或者如果您想稍后向其添加对象,您应该将其定义为NSMutableArray,如下所示:

@property (nonatomic, retain) NSMutableArray *arr;
Run Code Online (Sandbox Code Playgroud)

并初始化:

self.arr = [NSMutableArray array];
Run Code Online (Sandbox Code Playgroud)

这将允许您稍后添加对象.

顺便说一句,如果你的dealloc方法出错,这可能意味着你的项目正在使用ARC,这是iOS 5中的一项新技术,这意味着你不再需要编写发布和保留语句.

如果您不使用ARC,我建议您这样做,因为它可以节省您不必担心这个保留/发布的东西 - 任何刚开始的iOS开发人员都应该为每个项目使用ARC,但因为它只是介绍在iOS 5中,很多Objective-C书籍都没有涵盖它.

  • @yAak实际上如果属性也有一个assign属性,可以使用self.arr = nil.有一种思想流派说你应该避免在你的dealloc中调用setter方法 - 我不会讨论为什么,因为你会发现整个讨论线程在堆栈溢出的人争论它而没有达成共识:-) (2认同)