【问题标题】:Objective-C LeakObjective-C 泄漏
【发布时间】:2012-02-21 09:17:43
【问题描述】:

谁能告诉我为什么这种方法会泄漏?我已经看了很长时间了,无法弄清楚它为什么会泄漏。泄露的对象是ContactOperations。 EventType 是 Malloc 和 Release。我认为init 可能是错误的?

联系人

ContactOperations *contactOps = [[ContactOperations alloc] initWithDatabase:database];
if ([contactOps applicationIsOwner])
    [contactOps startOperations];    
[contactOps release];

仪器说分配器给了我泄漏...

联系运营

ContactOperations
- (id)initWithDatabase:(Database*)aDatabase
{
    if (self = [super init])
    {
        database = [aDatabase retain];
        parameter = [[Parameter alloc] init];
        parameter.database = aDatabase;
        //addressBook = ABAddressBookCreate();
    }
    return(self);
}



-(void)dealloc
{
    [database release];   
    [parameter release];
    //CFRelease(addressBook);
}

【问题讨论】:

  • 你尝试过从 Xcode 内部进行静态分析吗?
  • contactOps 是否保留在 -[ContactOperations startOperations] 的某个位置?除此之外,您发布的代码中没有任何泄漏。
  • 愚蠢的问题:如果您在发布后将contactOps 设置为nil,它仍然会发出警告吗?如果没有,从技术上讲,您仍然可以从您的代码中访问过度发布的实例。
  • @trojanfoe - 静态分析找不到任何东西。
  • @Costique 它没有保留这是它使用的唯一方式。

标签: iphone objective-c ios memory-leaks


【解决方案1】:
-(void)dealloc
{
    [database release];   
    [parameter release];
    //CFRelease(addressBook);
}

你忘记了- (void) dealloc末尾的[super dealloc];。您必须调用 [super dealloc] 才能清除 ContactOperations 超类的实例变量。

【讨论】:

  • 对。当使用引用计数而不是垃圾收集器时,这是必需的。
  • 我感到非常尴尬和伟大的合而为一。我在这上面浪费了几个小时。
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 2023-04-06
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多