关于在属性中保留属性的问题

Posted

技术标签:

【中文标题】关于在属性中保留属性的问题【英文标题】: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 中),那么这似乎真的很矛盾。

【问题讨论】:

【参考方案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 行。

以上是关于关于在属性中保留属性的问题的主要内容,如果未能解决你的问题,请参考以下文章

Django 表单子类化 - 如何修改继承字段的某些属性,同时保留其他属性?

释放属性的简单模式

如何更新 UIView 的图层属性并为其子视图保留图层?

aurelia组件html属性属性中的多行

Weka中名义属性的缺失值

保留 XML 属性顺序?