【问题标题】:question about retain attribute in properties关于在属性中保留属性的问题
【发布时间】:2010-10-24 04:31:29
【问题描述】:

客观的 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) 如果上面是正确的,那么retain属性只有在setter调用正确的时候才会增加retain count?

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

NSString *b = [someOtherString retain];

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

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

【问题讨论】:

    标签: objective-c retain


    【解决方案1】:

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

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

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

    3) 其实应该是:

    b = [someothestring copy];
    

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

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

    【讨论】:

    • 感谢您的回答,但由于它与#4有关,我仍然有点困惑。我不明白您所说的“保留,因为在内部,对象被保留”是什么意思。据我了解,您可以在初始化程序中显式保留该对象,但由于它具有只读属性,因此您不能使用设置器(合成的)来执行此操作。因此,如果您保留它的唯一方法是显式调用其上的保留,则属性中的“保留”似乎是多余的。
    • @property 中的 'retain' 意味着如果你没有定义一个 setter,编译器会定义一个像: - (void)setFoo:(NSString *)newFoo { if (foo ! = newFoo) { [foo 发布]; foo = [newFoo 保留];仅仅因为它在 .h 文件中说 readonly 并不能阻止您在 @interface MyClass() 块中覆盖 .m 文件中的 @property 行。
    猜你喜欢
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多