#iphone #objective-c #ios #automatic-ref-counting
#iPhone #objective-c #iOS #автоматический подсчет ссылок
Вопрос:
В ARC какой смысл делать каждый IBOutlet свойством? Что было бы недостатком использования ivar для IBOutlets, используемых только внутри контроллера представления?
Комментарии:
1. Как вы думаете, почему нужно создавать свойства?
2. @Phlibbo: Я продолжаю видеть здесь и там, что это «хорошая практика» и упрощает код viewDidUnload.
3. Хотелось бы, чтобы была книга «Эффективная iOS», похожая на те, что написаны Скоттом Мейерсом и Хербом Саттером для C .
Ответ №1:
Если вы ни для чего не используете методы setter / getter, не полагайтесь на наблюдение за значениями ключей для этих свойств и не ожидайте, что подкласс выиграет от переопределения этих свойств, тогда нет реального недостатка в простом использовании ivars для IBOutlets в ARC.
Комментарии:
1. Спасибо, ivars устранит множество
self.
префиксов в моем коде.2. Пожалуйста, ознакомьтесь с моим ответом и дайте мне знать, если у вас есть какие-либо идеи о том, что происходит.
Ответ №2:
Я использовал ivars для своих «частных» IBOutlets и столкнулся с проблемами утечки памяти. Я думаю, это потому, что мои IBOutlets использовали __unsafe_unretained
атрибут вместо __weak
. Я не могу использовать __weak
, потому что он не поддерживается на iOS 4 (я хочу, чтобы мое приложение было обратно совместимо с iOS 4). Трудно понять, что на самом деле происходит с ARC, IBOutlets, viewDidUnload и всем этим беспорядком. Вздох…
В любом случае, когда я изменил свои IBOutlets с ivars на properties, проблемы с утечкой памяти исчезли.
Итак, чтобы ответить на мой собственный вопрос, одним из недостатков использования ivars для IBOutlets является то, что вы можете столкнуться с утечками памяти, если у вас есть __unsafe_unretained
атрибут.
Комментарии:
1. Маловероятно, что это было источником ваших утечек. Если ваши розетки были
__unsafe_unretained
, то по определению эти ивары не сохраняли свои цели, а не сохранение чего-либо никогда не может привести к утечке. (Это может привести к сбою, но это уже другая история.) Вы не указали, были ли добавленные вами свойства аналогичнымиunsafe_unretained
, но в любом случае единственное, что вы могли бы сделать, добавив свойства, — это увеличить сохранение. Без более подробной информации невозможно сказать, почему у вас произошла утечка. Вы могли бы задать еще один вопрос, если вам действительно интересно.2. Свойства, которые я добавил, действительно
unsafe_unretained
были. Я действительно озадачен тем, почему изменение IBOutlets с ivar на properties имело значение. Возможно, я неправильно интерпретирую инструменты XCode.3. unsafe_unretained может привести к сбою, но это не приведет к утечке. Я бы сказал, что вы неправильно интерпретируете инструменты. Извините. 🙂 Но, тем не менее, прошло уже много месяцев: есть ли у вас какое-либо дополнительное представление о том, что происходило?
4. Я перешел на iOS 5 (прекратил поддержку iOS 4.x), поэтому я больше не использую
unsafe_unretained
. Я не пытался изменить своиIBOutlet
свойства обратно на ivars, поэтому я не знаю, осталась ли исходная проблема.5. У нас была точно такая же проблема. У нас были IBOutlets как ivar с unsafe_unretained, и у нас была утечка памяти, которая в конечном итоге привела бы к сбою приложения. Если бы мы нацелились на iOS 5 и изменили их на слабые, это было бы нормально. В итоге мы переместили их в свойства с помощью unsafe_unretained, и теперь все в порядке.