【问题标题】:Allocating a property in Objective-C在 Objective-C 中分配属性
【发布时间】:2012-03-03 10:06:21
【问题描述】:

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

如果我有以下属性:

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

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

arr=[[NSArray alloc]init];

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

      _arr = [[NSArray alloc] init];
      
    2. 使用这样的自动释放值设置属性:

      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 中的一项新技术,这意味着你不再需要编写 release 和 retain 语句。

    如果您不使用 ARC,我建议您这样做,因为它可以让您不必担心保留/释放的问题 - 现在任何刚开始的 iOS 开发人员都应该在每个项目中真正使用 ARC,但因为它只在 iOS 5 中引入,很多 Objective-C 书籍都没有介绍。

    【讨论】:

    • 在 dealloc 中释放数组的另一种安全方法是self.arr = nil;(只要您的属性具有保留属性)
    • 您也可以通过覆盖属性的 getter 来懒惰地初始化数组,尽管使用这么简单的东西可能没有太多理由这样做。
    • @yAak 实际上,如果属性也具有分配属性,则可以使用 self.arr = nil 。有一种观点认为你应该避免在你的 dealloc 中调用 setter 方法——我不会解释为什么,因为你会发现整个讨论线程都在讨论堆栈溢出的人而没有达成共识:-)
    • @David +1 表示懒惰的构造函数,但老实说,我认为在现阶段引入这可能是一个高级概念;-)
    • @NickLockwood:很多人似乎不接受-dealloc 中反对使用属性设置器的论点,但经验的重要性在于避开它们。
    猜你喜欢
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2015-11-26
    • 1970-01-01
    相关资源
    最近更新 更多