我在理解属性方面遇到了问题。 如果我想要一个属性不被其访问者修改(通过复制返回)并通过引用(保留)设置,我应该写什么样的属性。
示例:
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];
答案 0 :(得分:4)
在标题中将该属性声明为retain:
@property (nonatomic. retain) MyType *attribute;
在实现文件中合成iVar:
@synthesize attribute;
但是提供你自己的吸气剂,它将覆盖合成的吸气剂:
- (MyType)attribute {
return [attribute copy];
}
我知道我不会自动释放返回的对象,但由于问题没有指定iOS,我是从垃圾收集环境的角度写的。
答案 1 :(得分:2)
在这种情况下,你应该自己写getter和setter。
答案 2 :(得分:1)
您可能会编写自己的访问者,但具体取决于您是否希望复制的“获取”返回是否自动释放:
完成“复制”的惯用方法是为访问者提供正常的“保留”属性,并支持-copy
或-mutableCopy
方法。后两者是语义复制对象的标准,返回的对象应该具有保留所有权。
如果你想让访问者-foo
返回“foo”的副本,这样调用者就无法操作内部版本,那没关系,但是你自己写的就是看像这样:
-
- (Foo *)foo
{
return [[foo copy] autorelease];
}
答案 3 :(得分:-2)
我建议不要通过副本返回。这会让你陷入内存管理。它是自动发布的吗?不保留?问题太多了。
相反,我推荐这个:
MyType* attr = [MyType typeWithMyType:MyObject.attribute];
或其他什么。