从地址簿iphone获取字节时应用程序崩溃

时间:2012-04-09 14:17:50

标签: iphone memory crash addressbook

这是我从AddressBook获取Notes的代码。

 +(NSString*)getNote:(ABRecordRef)record {

  return ABRecordCopyValue(record, kABPersonNoteProperty);
}

但是在上面的实现中我有内存泄漏。所以为了消除内存泄漏,我写了以下代码

    +(NSString*)getNote:(ABRecordRef)record {

    NSString *tempNotes = (NSString*)ABRecordCopyValue(record, kABPersonNoteProperty);
    NSString *notes = [NSString stringWithString:tempNotes];
    [tempNotes release];
    return notes;

}

如果我写上面的代码我的应用程序崩溃了。什么出错了?感谢。

更新:我将此方法称为:

notes = [AddreesBook getNote:record];

其中笔记是我的ivar&我用dealloc方法发布它。

2 个答案:

答案 0 :(得分:1)

您的第一次实施违反了所有权规则:

Memory Management Rules

也就是说,您正在使用的API调用包含“复制”,但您将其视为自动释放的对象。

鉴于你在修改后的实现中返回了一个自动释放的对象,我怀疑你没有保留你返回的音符字符串。如果在调试器下运行,您的应用程序在NSPopAutoreleasePool()崩溃,您将能够确定是否是这种情况。

一个简单的测试是将-retain发送到您回来的备注对象,看看崩溃是否消失:

NSString    *note = [ MyAddressBook getNote: abRecord ];

[ note retain ];
/* ... use note ... */

/* we retained the object, we must also release it when done with it. */
[ note release ];

答案 1 :(得分:0)

假设record参数设置正确,则以下内容应返回自动释放的NSString。

+ (NSString *)getNote:(ABRecordRef)record {
    return [(NSString *)ABRecordCopyValue(record, kABPersonNoteProperty) autorelease];
}

但是,我目前还没有看到为什么你当前版本的getNote无效。