在Objective-C中分配属性

时间:2012-02-10 23:21:39

标签: iphone objective-c xcode cocoa-touch memory-management

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

如果我有以下属性:

@property (nonatomic, retain) NSArray *arr;
@synthize arr=_arr;

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

arr=[[NSArray alloc]init];

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

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

1 个答案:

答案 0 :(得分:5)

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

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

    _arr = [[NSArray alloc] init];
    
  2. 使用自动释放的值设置属性,如下所示:

    self.arr = [NSArray array];
    
  3. 你可以在类的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书籍都没有涵盖它。