освободить объект ABMultiValueRef - PullRequest
4 голосов
/ 15 марта 2011

В моем приложении статический анализатор указывает на утечку в следующем коде:

ABMultiValueRef phone = (NSString *)ABRecordCopyValue(person,  kABPersonPhoneProperty);
NSString *mobilephone= (NSString*)ABMultiValueCopyValueAtIndex (phone,0);  

аналогично всякий раз, когда я использую эту функцию, ABRecordCopyValue указывает на утечку

Я пытался освободить его методом [phone release];, однако я получаю предупреждение компилятора "недопустимый тип получателя" abmultivalueref "". Как правильно выпустить это?

Ответы [ 3 ]

5 голосов
/ 15 марта 2011

Похоже, вы путаете типы данных NS с типами данных CF.Методы адресной книги обычно возвращают базовые (CF) объекты.Эти объекты являются бесплатными мостовыми соединениями, что означает, что они могут использоваться взаимозаменяемо с NS типами.

При использовании базовых базовых объектов любой метод с именем «copy» вернет объект, который вам позже понадобитсявыпустить, используя CFRelease.Только если вы приведете его к эквиваленту NS, вы можете использовать - release.

Таким образом, ваш код может быть записан в виде одного из следующих:

ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
NSString *mobilephone = (NSString *)ABMultiValueCopyValueAtIndex(phone, 0);

// other code

[mobilephone release];

или

ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
CFStringRef mobilephone = ABMultiValueCopyValueAtIndex(phone, 0);

// other code

CFRelease(mobilephone);
1 голос
/ 08 апреля 2016

Использование __bridge_transfer гарантирует, что ARC освободит объект для вас. Использование __bridge означает, что вы должны освободить возвращенный объект вручную.

1 голос
/ 15 марта 2011

Вы пробовали с CFRelease(phone);?
Поскольку ABMultiValueCopyValueAtIndex не является строкой NSSt, это CFStringRef

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...