2012-01-17 2 views
5

Скажем, у меня есть сильное свойство, как так:Безопасно ли присвоить свойство результат автореализованного инициализатора при использовании ARC?

@interface Foo 
    @property (strong, nonatomic) NSArray *myArray; 
    @end 

И, на мой инициализаторе, я поставил туАггау так:

myArray = [NSArray array]; 

Является ли это безопасно? Поможет ли ARC должным образом сохранить myArray для меня?

Причина, по которой я прошу, состоит в том, что у меня есть проект, где myArray не должным образом сохранен в этом сценарии, и я получаю плохой доступ к памяти по дороге.

Но, если я использую

myArray = [[NSArray alloc] init]; 

то все хорошо.

+0

Под «в моем инициализаторе» вы подразумеваете метод 'init [With ...]' вашего класса, правильно? –

+1

Вы не используете свойство в своем назначении, вы напрямую назначаете поддержку ivar (что верно в инициализаторе). Но это не имеет значения, ARC сохранит этот массив в любом случае. (Так как базовый ivar тоже должен быть __strong) –

ответ

7

Да, ARC автоматически сохранит его для вас.

Способ думать о ARC заключается в следующем: если у вас есть сильный указатель на объект, он гарантированно останется в живых. Когда все указатели (ну, все сильные указатели) к объекту уходят, объект умрет.

Из описания вашей проблемы, похоже, что ARC неправильно включен в файле, в котором выполняется этот код. Несмотря на это, я бы рекомендовал запустить приложение с помощью инструментов, используя шаблон «Zombies». Это позволит вам увидеть полную историю сохранения/выпуска этого объекта, и вы должны быть в состоянии выяснить, где все идет не так.

+0

У меня определенно есть это. Возможно, в моем классе есть что-то еще ... – jimothy

+0

Я обновил свой ответ, чтобы поговорить о шаблоне «Зомби» в «Инструменты»; вот где я буду идти дальше. –

Смежные вопросы