【发布时间】:2010-06-04 05:23:23
【问题描述】:
大家好,我开始使用 Objective-C,我想确保我得到正确的内存/属性。
假设如下代码:
@interface Rectangle : NSObject
{
Vector2* origin;
//[...]
}
Rectangle* myRect = [[Rectangle alloc] init];
myRect.origin.x = 100.0f;
[myRect print];
myRect.origin = [[Vector2 alloc] init]; //hummm.. 2 concerns here.
关注点 1:
假设 origin 是标准(分配)综合属性:
在分配新的 Vector2 时,myRect 之前的原始引用计数是否会自动变为 0,而 GC 稍后会处理它?还是我必须在属性内显式调用 release?
关注点 2:
假设 origin 将是一个“保留”属性:(顺便说一句:在声明合成保留属性时会自动生成那种代码,这可能吗?)
-(void) setOrigin: (Vector2*)newOrigin {
[newOrigin retain];
[origin release]
origin = newOrigin;
}
那么当做:
myRect.origin = [[Vector2 alloc] init]
这不会导致双重引用计数增加,然后需要调用两次释放以避免泄漏?在使用库/其他人的代码来避免此类问题时,你们是否依赖有据可查的代码(知道这是一个保留属性),还是有一些更安全的分配/初始化对象的方法?
感谢您的提示!
【问题讨论】:
-
澄清一下 -
origin应该是Vector2*类型,对吧? -
关于合成属性生成什么样的代码,您发布的是一个选项,是我在属性和垃圾收集之前使用的选项。还有其他变化。此外,在原子属性中,这些语句将被某种互斥体括起来。
标签: objective-c memory