代码之家  ›  专栏  ›  技术社区  ›  vdsf

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

  •  0
  • vdsf  · 技术社区  · 16 年前

    假设以下代码:

    @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:

    在分配新的Vector2时,myRect以前的origin ref计数是否自动变为0,GC稍后会处理它?或者我必须在属性内部显式调用release?

    假设origin是一个“retain”属性:(顺便问一下:当声明一个合成的retain属性时,这种代码会自动生成吗

    -(void) setOrigin: (Vector2*)newOrigin {
       [newOrigin retain];
       [origin release]
       origin = newOrigin;
    }
    

    然后在执行以下操作时:

    myRect.origin = [[Vector2 alloc] init]
    

    这不会导致双引用计数增加,然后需要调用release两次以避免泄漏吗?在使用库/其他人的代码来避免此类问题时,你们是否依赖文档化的代码(知道它是一个retain属性),还是有一些更安全的alloc/init对象方法?

    谢谢你的小费!

    1 回复  |  直到 16 年前
        1
  •  4
  •   Georg Fritzsche    16 年前

    问题1:

    不,assign属性只执行它所说的-assign。它既不保留也不释放-在这种情况下,您必须手动处理它。

    myRect.origin = [[Vector2 alloc] init]
    

    这不会导致双重引用计数增加吗

    是的,这就是为什么你要么使用自动释放:

    myRect.origin = [[[Vector2 alloc] init] autorelease];
    

    ... 或手动释放:

    Vector2 *v = [[Vector2 alloc] init];
    myRect.origin = v;
    [v release];
    

    至于如何处理这些问题:

    • memory management guide
    • 看看文件或财产申报单上写着什么
    • 对于传递给方法的参数,除非另有说明,否则始终假定被调用方在需要时保留