【问题标题】:app crash when accessing First name from address book due to memory management由于内存管理,从地址簿访问名字时应用程序崩溃
【发布时间】:2013-05-27 11:22:58
【问题描述】:

我正在尝试访问地址簿中的所有名字值字段。我正在为此使用此代码

CFStringRef firstName = ABRecordCopyValue(aSource, kABPersonFirstNameProperty);
first_name=[NSString stringWithFormat:@"%@",firstName];
CFRealease(firstname)

我没有使用 ARC。所以我最后需要 CFRealease(firstname) 。但是在我的代码中,当我添加 CFRealease(firstname) 时,我的应用程序此时崩溃,没有这个应用程序可以正常工作。

但是当我尝试使用分析器分析我的应用程序时,它说 object Leaked: object assigned and stored into 'firstname' is not refrenced later in the execution path and has a retain count of +1.

中间名和姓氏的大小写相同,其代码如下。

 CFStringRef midname = ABRecordCopyValue(aSource, kABPersonMiddleNameProperty);
 mid_name=[NSString stringWithFormat:@"%@",midname];
 CFRelease(midname);

 CFStringRef lastName = ABRecordCopyValue(aSource, kABPersonLastNameProperty);
 last_name=[NSString stringWithFormat:@"%@",lastName];
 CFRelease(lastName);

请告诉我哪里做错了。提前致谢。

【问题讨论】:

  • 应用程序崩溃,因为您的 first_name 字符串正在存储一些字符串,并且在存储后您立即意识到它。而且您还必须在应用程序中使用 first_name,因此一旦您确定了 first_name,它就不会在内存池中获得任何分配。所以,试着在你不再需要它们的地方实现你的字符串。
  • 你应该检查你的变量的写法(大写和小写),例如您正在使用 firstName 和 firstname。
  • @DeepakKhiwani 感谢您的回复,但是在我将 firstName 值发送到另一个 NSString 变量 first_name 之后我将释放 firstName,然后我释放了 firstName,因为现在我不再需要它了,不知何故我也有甚至在我不再需要它的 for 循环结束时尝试释放它,但这也不起作用。
  • @ReinhardMänner 这是一个拼写错误。对不起..

标签: iphone memory-management cfstring


【解决方案1】:

假设您在firstname(而不是firstName)中存储了对名字的引用,如果firstnamenil,当您尝试释放引用的对象时,您的应用程序将崩溃。如果您的应用程序无权访问地址簿(联系人数据库),则可能会发生这种情况,因为用户尚未授予对它的访问权限。这必须在 iOS 6 中说明。在这种情况下,不会返回任何联系人。
您可以要求访问,例如使用以下代码:

-(bool)userGrantedReadAccessToContacts
{
    __block BOOL accessGranted = NO;
    if (ABAddressBookRequestAccessWithCompletion != NULL) { // iOS 6
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        ABAddressBookRequestAccessWithCompletion(contactsRef, ^(bool granted, CFErrorRef error) {
            accessGranted = granted;
            dispatch_semaphore_signal(sema);
        });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    }
    else { // iOS 5 or earlier
        accessGranted = YES;
    }

    return accessGranted;
}

【讨论】:

  • 感谢您的回复,但我已经在处理此权限问题,正如我告诉您的,问题与内存管理有关。无论如何感谢您的回复。
  • 那么当你试图释放它时,你确定 firstname 不是 nil 吗?
  • 是的,我确定。这是一个内存泄漏问题。我通过不使用cfstring解决了它。我的意思是现在我没有使用 ** CFStringRef firstName = ABRecordCopyValue(aSource, kABPersonFirstNameProperty); first_name=[NSString stringWithFormat:@"%@",firstName];** 我直接使用 first_name = ABRecordCopyValue(aSource, kABPersonFirstNameProperty); 并且没有泄漏
  • 好吧,最初您说“当我添加 CFRealease(firstname) 时,我的应用程序此时崩溃”。因此,我认为发布是问题所在。您还说您有错误消息“分配并存储到 'firstname' 中的对象稍后不会被引用”,但它在版本的后期被引用,至少如果 firstName 和 firstname 相同。现在在我看来, first_name 也与 firstName 和 firstname 相同 - 非常令人困惑......至少你解决了你的问题。
猜你喜欢
  • 2017-03-13
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 2014-03-30
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多