Эквивалент сохранения переменной экземпляра в ARC - PullRequest
0 голосов
/ 19 марта 2012

Я использую RestKit для разработки RESTful-приложения.У меня есть объект-обертка, который на самом деле обрабатывает запросы и даже действует как delegate для RKObjectManager.У меня возникла проблема, связанная с тем, как ARC обрабатывает переменные экземпляра и сохраняет их, и мне ясно, что я не понимаю, как работает ARC.

Так что, когда я делаю это, происходит сбой (с ошибкой, связанной ссообщение, отправленное в освобожденный экземпляр)

MyTestClient *testClient = [[MyTestClient alloc] init];

, но когда я объявляю свойство и делаю это, все в порядке:

self.testClient = [[MyTestClient alloc] init];

Насколько я понимаю, в ARC переменная экземпляра по умолчанию всегда strong, но ее жизненный цикл является областью действия метода, в котором она объявлена.

Поскольку я не могу сделать [testClient retain],мой единственный вариант сделать его собственностью?

Ответы [ 2 ]

5 голосов
/ 19 марта 2012

Ваши переменные являются сильными по умолчанию и будут сохранены в их пределах.Таким образом, в первом примере объект будет сохранен только до конца функции.Во-вторых, поскольку у вас есть переменная экземпляра, она будет сохраняться до тех пор, пока не будет освобожден объект-владелец (вероятно, достаточно долго для вас в этом случае).Лучший вариант - сделать его свойством, но вы также можете просто сделать его переменной экземпляра.В этом случае он сделает то же самое для вас.

Простой способ думать об этом - вам нужен сильный указатель на объект, пока он вам больше не понадобится.

0 голосов
/ 19 марта 2012

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

Как сказал wbyoung. Вы получаете ошибку, потому что testClient активен только внутри того места, где вы его инициировали, это viewdidload, или init, или w / e.

...