0

客观的 C 文档说关于属性中的保留属性:

保留 指定在分配时应在对象上调用保留。(默认为分配。)先前的值被发送释放消息。

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 文档说:

保留 指定在分配时应在对象上调用保留。(默认为分配。)先前的值被发送释放消息。

2)如果以上是正确的,那么当setter被调用正确时,retain属性只会增加retain count?

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

NSString *b = [someOtherString retain];

考虑到您已经从b.

4)在上面的例子中也有@property (retain, readonly) SomeObject *t;类似的东西。UITableViewCell“readonly”表示没有合成吸气剂。如果我对“保留”的理解是正确的(即它只发生在二传手中),那么这似乎真的很矛盾。

4

1 回答 1

0

b=c; 不会增加保留计数,但

自我.b=c; 将增加保留计数。

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

3)实际上,它应该是:

b = [someothestring copy];

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

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

于 2010-10-24T04:39:33.520 回答