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

持票人被留置时被留置财产的行为

  •  1
  • NewbiZ  · 技术社区  · 15 年前

    我是一个初学者ObjvEC程序员,来自C++世界。我发现很难理解nsObject提供的内存管理:/

    假设我有以下课程:

    @interface User : NSObject
    {
      NSString* name;
    }
    
    @property (nonatomic,retain) NSString* name;
    
    - (id)   initWithName: (NSString*) theName;
    - (void) release;
    
    @end
    
    @implementation User
    
    @synthesize name
    
    - (id) initWithName: (NSString*) theName
    {
        if ( self = [super init] )
        {
            [self setName:theName];
        }
        return self;
    }
    
    - (void) release
    {
        [name release];
        [super release];
    }
    
    @end
    

    不考虑以下代码,我无法理解保留计数结果:

    NSString* name = [[NSString alloc] initWithCString:/*C string from sqlite3*/];
    // (1) name retainCount = 1
    User* user = [[User alloc] initWithName:name];
    // (2) name retainCount = 2
    [whateverMutableArray addObject:user];
    // (3) name retainCount = 2
    [user release];
    // (4) name retainCount = 1
    [name release];
    // (5) name retainCount = 0
    

    在(4)时,名称的保留计数从2减少到1。但这不正确,数组中仍然有指向名称的用户实例! 变量的保留计数只应在引用变量的保留计数为0时减少,也就是说,在解除锁定时,不应释放。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Frank Schmitt    15 年前

    你不应该重写 release ,您应该只重写 dealloc . 当保留计数为 user 达到零,它的 释放内存 将被调用,释放 name .

    如果重命名 释放 覆盖到 释放内存 ,保留计数将按您预期的方式工作。

        2
  •  2
  •   stefanB    15 年前

    User 这是:

    - (void) release
    

    应该是:

    - (void) dealloc
    

    你在搅拌 name user 内存管理-每个对象都有自己的内存。

    4)你自己打电话 release 不是的方法 NSObject 释放 所以我想它不会像预期的那样工作。更改名称 释放 dealloc 对你 用户 .

    修复后,我们可以查看您还有哪些其他问题。