具有返回getter中对象副本的属性,并保留setter中的对象

时间:2011-01-07 18:25:24

标签: objective-c properties copy retain

我在理解属性方面遇到了问题。 如果我想要一个属性不被其访问者修改(通过复制返回)并通过引用(保留)设置,我应该写什么样的属性。

示例:

MyType* theAttribute = MyObject.attribute;
[theAttribute changeSomething]; // Does not have to change the MyObject attribute, working with a copy return

MyType tmpObject = [[MyType alloc] init];
MyObject.attribute = tmpObject; // Want a retain here
[tmpObject release];

4 个答案:

答案 0 :(得分:4)

在标题中将该属性声明为retain:

@property (nonatomic. retain) MyType *attribute;

在实现文件中合成iVar:

@synthesize attribute;

但是提供你自己的吸气剂,它将覆盖合成的吸气剂:

- (MyType)attribute {
    return [attribute copy];
}

我知道我不会自动释放返回的对象,但由于问题没有指定iOS,我是从垃圾收集环境的角度写的。

答案 1 :(得分:2)

在这种情况下,你应该自己写getter和setter。

答案 2 :(得分:1)

您可能会编写自己的访问者,但具体取决于您是否希望复制的“获取”返回是否自动释放:

  1. 完成“复制”的惯用方法是为访问者提供正常的“保留”属性,并支持-copy-mutableCopy方法。后两者是语义复制对象的标准,返回的对象应该具有保留所有权。

  2. 如果你想让访问者-foo返回“foo”的副本,这样调用者就无法操作内部版本,那没关系,但是你自己写的就是看像这样:

  3. -

    - (Foo *)foo
    {
        return [[foo copy] autorelease];
    }
    

答案 3 :(得分:-2)

我建议不要通过副本返回。这会让你陷入内存管理。它是自动发布的吗?不保留?问题太多了。

相反,我推荐这个:

MyType* attr = [MyType typeWithMyType:MyObject.attribute];

或其他什么。