这是我从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方法发布它。
答案 0 :(得分:1)
您的第一次实施违反了所有权规则:
也就是说,您正在使用的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
无效。