启动Objective-C,内存泄漏问题

时间:2010-06-04 05:23:23

标签: objective-c memory

嘿伙计们,我开始玩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对象方法?

感谢您的提示!

1 个答案:

答案 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];

至于如何管理这些问题:

  • 阅读memory management guide
  • 查看文档或财产声明中的内容
  • 对于传递给方法的参数,
  • 总是假设被调用者在需要时保留 - 除非另有说明