Полезность использования свойств для IBOutlets в ARC?

#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, и теперь все в порядке.