【问题标题】:App crashes when getting Notes from AddressBook iphone从 AddressBook iphone 获取笔记时应用程序崩溃
【发布时间】:2012-04-09 14:17:49
【问题描述】:

这是我从 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];

notes 是我的 ivar,我在 dealloc 方法中释放它。

【问题讨论】:

  • 当它崩溃时它会说什么?...

标签: iphone memory crash addressbook


【解决方案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 ];

【讨论】:

  • 感谢您的信息。我会检查你的解决方案。
【解决方案2】:

假设record 参数设置正确,下面应该返回一个自动释放的NSString。

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

但是,我目前不明白为什么您当前版本的 getNote 不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2014-12-01
    • 2011-06-20
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多