Objective-C属性 - 保留和分配之间的差异

时间:2010-06-07 13:18:25

标签: objective-c memory-management properties

我想我遗漏了一些关于属性的东西。 首先,我无法理解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;

非常感谢......

2 个答案:

答案 0 :(得分:11)

  

之间有什么不同:@property(readwrite,assign)int iVar;到@property(readwrite,retain)int iVar;到@property(readwrite)int iVar;

@property (readwrite,assign) sometype aProperty;的setter在语义上等同于

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

如果你提出

,你或多或少会得到什么
@asynthesize aProperty = ivar;

在您的实施中。

@property (readwrite,retain) sometype aProperty;的setter在语义上等同于

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

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

@property (readwrite,copy) sometype aProperty;的setter在语义上等同于

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

在这种情况下,不仅某些类型必须是一个客观的C类,而且它必须响应-copyWithZone:(或等效地,实现NSCopying)。

如果省略保留或分配或复制,则默认为assign。

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

答案 1 :(得分:4)

有两种说明符:

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

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

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

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

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

对于copy,这意味着该对象将收到retain消息,而不是copy。这意味着你最终会得到原始对象的副本,保留计数为1,所以你还要负责释放它。