【问题标题】:Objective-C Property - Difference Between Retain and AssignObjective-C 属性 - 保留和分配之间的区别
【发布时间】:2010-06-07 13:18:24
【问题描述】:

我想我遗漏了一些关于属性的东西。 首先,我无法理解retainassign 之间的区别。

如果我使用assign,属性是否将retain 计数器增加1 到setter 和getter,我是否需要对它们都使用release

这如何与readwritecopy 一起工作?从retain 计数的角度来看。

我试图了解在使用属性(setter 和 getter)后何时需要使用 release

@property (readwrite,assign) int iVar; 

assign 在这里做什么?

有什么区别:

@property (readwrite,assign) int iVar;

@property (readwrite,retain) int iVar;

@property (readwrite) int iVar;

非常感谢...

【问题讨论】:

    标签: objective-c memory-management properties


    【解决方案1】:

    之间有什么区别:@property (readwrite,assign) int iVar;到 @property (readwrite,retain) int iVar; to @property (readwrite) int iVar;

    @property (readwrite,assign) sometype aProperty; 的设置器在语义上等价于

    -(void) setAProperty: (sometype) newValue
    {
        ivar = newValue;
    }
    

    上面的内容或多或少是你放了会得到的东西

    @asynthesize aProperty = ivar;
    

    在您的实施中。

    @property (readwrite,retain) sometype aProperty; 的设置器在语义上等价于

    -(void) setAProperty: (sometype) newValue
    {
        [newValue retain];
        [ivar release];
        ivar = newValue;
    }
    

    显然,保留或释放 int 是没有意义的,因此 sometype 必须是 idSomeObjectiveCClass*

    @property (readwrite,copy) sometype aProperty; 的设置器在语义上等价于

    -(void) setAProperty: (sometype) newValue
    {
        sometype aCopy = [newValue copy];
        [ivar release];
        ivar = aCopy;
    }
    

    在这种情况下,sometype 不仅必须是一个目标 C 类,而且它必须响应 -copyWithZone:(或等效地,实现 NSCopying)。

    如果省略retain 或assign 或copy,则默认为assign。

    顺便说一句,我已经通过不考虑发生的锁定来简化上述内容,因为属性也没有指定nonatomic

    【讨论】:

      【解决方案2】:

      有两种说明符:

      readwrite 说明符告诉该属性将是读/写的,因此当您执行 @ synthesize 时,它将同时创建 getter 和 setter。

      还有readonly,指定属性只有一个getter。

      其他修饰符指定属性在引用计数方面的行为方式:

      assign 修饰符告诉 ivar 将简单地分配给 setter 接收到的任何内容。因此,如果是对象,retain 将不会被调用。

      使用retain,无论何时使用合成setter,都会调用retain,所以对象会被保留。这意味着具有 setter 的类在某个时候需要 release 它(可能在其 dealloc 方法中)。

      至于copy,表示对象将收到copy消息,而不是retain。这意味着您最终将获得原始对象的副本,保留计数为 1,因此您再次负责释放它。

      【讨论】:

      • 所以如果我理解正确 1. 读写只是分配一个指针并返回一个指针而不改变计数器? 2. 当我使用 assing 时,我只是得到指向对象的指针并且没有保留,所以如果对象将释放,我会失去他吗?并且保留不是这样吗? 3. 至于副本,我理解 setter 用 count 1 创建新对象,而 getter 只返回指针?当我使用retain属性时,getter怎么样,我听说过autorelease指针?
      • 我稍微澄清了我的答案。有两种说明符:一种与属性如何访问有关(readwritereadonly),另一种与属性如何处理内存有关(assignretaincopy) .您需要同时使用两者,并且它们是正交的(readwrite 属性可以是 retainassigncopy
      猜你喜欢
      • 2012-10-03
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多