Arc-ObjC объекты с переменными экземпляра CF


Я думаю, что здесь я-костяная голова...

Статический анализатор жалуется в методе -(void)doSomethingInteresting:

Потенциальная утечка объекта, хранящегося в myAddressBook

Ну, конечно, это имеет смысл; я вызываю функцию create без соответствующего release. Но я не думаю, что хочу выпустить myAddressBook в конце -doSomethingInteresting, потому что я хочу, чтобы он оставался в течение всей жизни AwesomeObject пример.

AwesomeObject.h

@interface AwesomeObject : NSObject

@property (assign, nonatomic) ABAddressBookRef addressBook;

@end

AwesomeObject.m

@implementation AwesomeObject

- (void)doSomethingInteresting
{
    CFErrorRef error = NULL;
    ABAddressBookRef myAddressBook = ABAddressBookCreateWithOptions(NULL, &error);

    [self setAddressBook:myAddressBook];
}

@end

Правка: снимок экрана прилагается

Стрелки Статического Анализатора

2 3

2 ответа:

Анализатор не понимает, что вы хотите присвоить сохраненную адресную книгу в свою собственность и, таким образом, не выпускать ее в конце doSomethingInteresting.

Измените свое свойство на:

@property (strong, nonatomic) id addressBook;

И установите его следующим образом:

[self setAddressBook:CFBridgingRelease(addressBook)];
Теперь, когда вы хотите использовать свойство addressBook, Используйте приведение (__bridge ABAddressBookRef).

Кроме того, вам нужно освободить потенциальный объект CFErrorRef, который, возможно, был создан во время ABAddressBookCreateWithOptions:

if(error)
{
    CFRelease(error);
    error = NULL;
}

Вам нужно назвать его так:

 [self setAddressBook:CFBridgingRelease(myAddressBook)];