【问题标题】:iPhone Question about propertiesiPhone关于属性的问题
【发布时间】:2010-10-20 16:32:49
【问题描述】:

如果声明一个带有retain属性的属性,是否需要先释放该属性再设置为nil?

@synthesize 指令有什么作用?

【问题讨论】:

    标签: objective-c cocoa ios4


    【解决方案1】:

    在您的属性 var 中设置另一个对象或 nil 之前,您确实需要释放(保留的)对象,但如果您愿意,这是由访问器完成的。

    self.myVar = nil;
    

    @synthesize 所做的是自动为您创建访问器方法(如果您没有定义它们)

    所以,如果你把你的财产写成:

    @property (nonatomic, retain) NSObject *property;
    

    那么您可以认为合成访问器将与以下内容等价(我之所以说等价是因为我们当然不知道这是如何完成的...有关更多信息,请阅读下面的文档):

    - (void) setProperty:(NSObject *)aProperty{
        if(property != aProperty){
            [property release];
            property = [aProperty retain];
        }
    }
    
    - (NSObject*) property{
        return property;
    }
    

    这部分非常重要,我建议花尽可能多的时间来了解这一点。 (另请阅读副本和分配)

    Apple doc on Properties

    【讨论】:

      【解决方案2】:

      您不需要在将保留属性设置为 nil 之前释放它,只要您使用为您执行释放的 setter。如果你用retain 声明了一个属性,合成的setter 将为你完成释放。这将我们带到了@synthesize 指令。它只是告诉编译器使用您在@property 中指定的属性为您编写setter 和getter。

      【讨论】:

        【解决方案3】:
        1. 不,事实上你根本不需要释放它。那将是一个错误。您甚至不必将其设置为 nil,除非您真的想控制它何时发布(即在您自己的课程发布之前)。
        2. 为您创建 getter 和 setter 方法,大概是以优化的方式。

        有关更多信息,我建议您阅读the relevant page in the guide

        【讨论】:

          猜你喜欢
          • 2010-12-28
          • 2011-09-28
          • 2011-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-19
          相关资源
          最近更新 更多