关于属性中的retain属性的问题

时间:2010-10-24 04:31:29

标签: objective-c retain

目标C文档说明了属性中的retain属性:

  

保留   指定在赋值时应在对象上调用retain。 (默认为assign。)   先前的值将发送一条释放消息。

我认为我理解了属性和属性,直到我在UITableViewCell参考指南中看到类似的内容:

@property(nonatomic, readonly, retain) UIImageView *imageView

然后阅读上面的内容真让我困惑。

我的问题:

1)假设我有:

@interface SomeClass: NSObject {
   NSString *b;
}
@property (nonatomic,retain) NSString *b;
@end

然后在实现文件中:

@implementation SomeClass
@synthesize b;

- (id) initWithSomeString(NSString *c) {
    if (self = [super init]) {
        b = c;
     }
}
@end

这不会增加“b”指向的对象的保留计数是否正确?我现在对此感到困惑,因为客观的C doc说:

  

保留   指定在赋值时应在对象上调用retain。 (默认为assign。)   先前的值将发送一条释放消息。

2)如果上面的说法是正确的,那么当调用setter时,retain属性只会增加保留计数吗?

3)我在某些地方听说在自己的初始化程序中调用对象的setter方法并不好。为什么?对我来说,如果你这样做并不好,那么就必须这样做:

NSString *b = [someOtherString retain];

考虑到你用b制作了一个属性,这似乎很奇怪。

4)在上面的@property (retain, readonly) SomeObject *t;示例中使用UITableViewCell之类的内容也令人困惑。 “readonly”意味着没有合成的吸气剂。如果我对“保留”的理解是正确的(也就是说它只发生在设定者中),那么这似乎是相互矛盾的。

1 个答案:

答案 0 :(得分:0)

B = C;不会增加保留计数,但

self.b = C;将增加保留计数。

2)是的,第二个调用setter,因此它会增加保留计数。第一个是原始的C赋值。

实际上,它应该是:

b = [someothestring copy];

您刚刚声明了对实例变量的本地覆盖访问权限,为其分配了一个(现在过度保留)对象,并在您离开此函数时泄露。

4)保留,因为在内部,对象被保留。只读,因为不允许使用此类的代码设置该字段,只有类是。