在init中调用dealloc?

0 objective-c init dealloc nsobject

我正在编写一个框架,我有一个自定义init方法的对象:

@implementation OSDatabase
@synthesize database;

// MEM
- (void)dealloc {
  sqlite3_close(database);

  [super dealloc];
}

// INIT
- (id)initWithDatabasePath:(NSString *)path error:(NSError **)error {
  if (self = [super init]) {
    if (!sqlite3_open_v2([path UTF8String], &database, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)) {
      error = [NSError errorWithDomain:@"OSDatabaseErrorDomain" code:1 userInfo:nil];
      [self dealloc];
      return nil;
    }
  }

  return self;
}

@end
Run Code Online (Sandbox Code Playgroud)

如果出现错误dealloc,在init方法内部调用是否安全?我不确定这一点,记忆管理是我生命中最重要的事情之一.

谢谢.

Jer*_*myP 6

如果出现错误,在init方法中调用dealloc是否安全?

-release不会发送你喜欢的其他地方.即使-init你不能保证当前的保留计数是1.


为什么一定要你永远不会发送-dealloc,除了[super dealloc]-dealloc?原因是你不能保证其他东西也会引用你的对象,即使在你的对象中也是如此,-init因为[super init]可能会选择保留对象.

如果返回的对象[super init]的保留计数为1,则发送-release将与发送具有相同的效果-dealloc.如果它的保留计数大于1,那么其他东西认为它拥有该对象并且解除分配会使它留下无效的指针,因此-release仍然是正确的做法.

这个:

while([self retainCount] != 0){[self release];}
Run Code Online (Sandbox Code Playgroud)

会导致无限循环,并且出于多种原因是一个糟糕的想法.对象的保留计数永远不会降到0. -release看起来像这样:

- (id)release
{
    if (retainCount == 1)
    {
        [self dealloc];
    }
    else
    {
        retainCount--;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以循环会将保留计数减少到1,然后永久地调用dealloc或直到它导致的堆损坏导致seg错误.

除了永远不会达到零之外,保留可能是UINT_MAX(例如在字符串或数字文字中),其通俗地意味着"此对象必须永远不会被释放".如果保留计数是UINT_MAX,-release则不会减少它.