嘿伙计们,我开始玩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是标准(assign)合成属性:
当分配新的Vector2时,myRect的先前原点引用计数是否自动变为0,GC将在以后处理它?或者我必须在属性中明确地调用release?
关注2:
假设origin是一个'retain'属性:(顺便说一句:在声明一个合成的retain属性时会自动生成那种代码吗?这可能吗?)
-(void) setOrigin: (Vector2*)newOrigin {
[newOrigin retain];
[origin release]
origin = newOrigin;
}
然后在做:
myRect.origin = [[Vector2 alloc] init]
这不会导致双引用计数增量,然后需要释放两次以避免泄漏吗?当你使用库/其他人的代码来避免这些问题时,你们是否依赖记录良好的代码(知道它是一个保留属性),还是有一些更安全的alloc / init对象方法?
感谢您的提示!
答案 0 :(得分:4)
关注1:
[...] myRect的先前原点引用计数是否自动变为0
不,分配属性就是它所说的 - 分配。它不会保留也不会释放 - 在这种情况下你必须手动处理它。
关注2:
myRect.origin = [[Vector2 alloc] init]
这不会导致双引用计数增量
是的,这就是你要么使用自动释放的原因:
myRect.origin = [[[Vector2 alloc] init] autorelease];
...或手动释放它:
Vector2 *v = [[Vector2 alloc] init];
myRect.origin = v;
[v release];
至于如何管理这些问题: