Проблема с автоматическим подсчетом ссылок: передача адреса нелокального объекта в параметр __autoreleasing для обратной записи - PullRequest
14 голосов
/ 14 сентября 2011

Я пытаюсь передать указатель на указатель на метод, но, очевидно, у ARC есть некоторые проблемы с тем, как я это делаю.Вот два метода:

+ (NSString *)personPropertyNameForIndex:(kSHLPersonDetailsTableRowIndex)index 
{
    static NSArray *propertyNames = nil;

    (nil == propertyNames) ? 
        [self SHL_initPersonPropertyNamesWithArray:&propertyNames] : NULL;
}

+ (void)SHL_initPersonPropertyNamesWithArray:(NSArray **)theArray
{
    *theArray = [[NSArray alloc] 
                 initWithObjects:@"name", @"email", @"birthdate", @"phone", nil];
}

Я получаю следующую ошибку:

Ошибка автоматического подсчета ссылок: передача адреса нелокального объекта в параметр __autoreleasing для обратной записи

В строке, где появляется следующая команда:

[self SHL_initPersonPropertyNamesWithArray:&propertyNames] : NULL;

1 Ответ

27 голосов
/ 15 сентября 2011

Для этого случая необходим спецификатор __strong для хранения.

+ (void)SHL_initPersonPropertyNamesWithArray:(NSArray * __strong *)theArray

Однако этот код не соответствует Основным правилам управления памятью .

У вас есть любой объект, который вы создаете

Вы создаете объект, используя метод, имя которого начинается с «alloc», «new», «copy» или «mutableCopy» (например, alloc, newObject или mutableCopy).

По какой причине вы хотите это сделать?

...