Нужно ли @ свойство для Интерфейсного Разработчика? - PullRequest
4 голосов
/ 02 января 2011

В моем подклассе UIViewController у меня есть 3 UIView с каждым @property как IBOutlet. Я не использую эти свойства вообще в моем коде. Представления создаются при создании контроллера представления, и они освобождаются при освобождении контроллера представления.

Я думал; я не могу просто удалить @property? Я сделал, и я все еще мог соединить свои переменные экземпляра (с IBOutlet) в Интерфейсном Разработчике.

Итак, мой вопрос сейчас таков; Есть ли какое-либо использование свойств в сочетании с Интерфейсным Разработчиком, или можно оставить их без внимания? Требуется ли это для некоторого управления памятью или чего-то еще? Или они действительно только для использования в вашем собственном коде?

И если я их опущу, мне все равно нужно release их в dealloc?

Ответы [ 5 ]

10 голосов
/ 02 января 2011

Они не нужны, но их настоятельно рекомендуют за тот простой факт, что они разъясняют управление памятью.

Например, если вы объявляете выход через ivar, какова его политика сохранения? Это сохраняется? Это авто-релиз? Вы владелец? У кого-то еще есть это? Там много неясностей (особенно с теми проклятыми объектами верхнего уровня, которые на Mac ведут себя не так, как на iPhone).

С другой стороны, если вы объявляете розетку через свойство, нет никакой двусмысленности, потому что политика управления памятью прямо указана в объявлении. В дополнение к наличию свойства, разархивирование пера будет видеть установщик и использовать его, таким образом, гарантируя, что ничего странного не происходит с передачей права собственности на объект и т. Д.

В двух словах, вы можете объявлять торговые точки без использования @property (что мы все должны были сделать до того, как они были введены в 10.5), но нет веских оснований для не их использования. Они действительно делают код намного понятнее относительно того, что именно происходит.

Для получения дополнительной информации об абсурдности управления памятью объектов пера, проверьте эту страницу в документации .

2 голосов
/ 02 января 2011

Существует две причины использовать свойство для просмотров:

  • Проще / безопаснее Управление памятью (Действительно веская причина)
  • Предоставление вашего интерфейса другим операторам (обычно это плохая практика кодирования)

Я всегда использую свойства, чтобы убедиться, что мой код не падает, если я забыл обнулить IBOutlets в viewDidUnload. В конце концов, не так сложно просто написать 2 строки кода.

Если вы хотите сохранить некоторые данные, не объявляйте ivars вообще. Код ниже работает просто отлично:

@interface MyController : UIController {
}
@property (nonatomic, retain) IBOutlet UIImageView* myImage;
@end

@implementation MyController
@synthesize myImage;

- (void) dealloc() 
{ 
   self.myImage = nil;
   [super dealloc];
}    

- (void) viewDidUnload()
{ 
   self.myImage = nil;
   [super viewDidUnload];
}
@end
2 голосов
/ 02 января 2011

да, вы можете:

@interface SomeClass : UIViewController {
    IBOutlet UILabel *myLabel;
}

@end

@ свойство предназначено только для определения управления памятью и получения и установки, чтения и записи и т. Д.

1 голос
/ 02 января 2011

Если вы не планируете манипулировать информацией о своих представлениях или получать к ней доступ из других контроллеров представлений или объектов и не планируете использовать их внутренне (в контроллере представлений), вам вообще не нужны @property оценки. Просто определите их как IBOutlet переменные экземпляра в интерфейсе вашего контроллера представления.

0 голосов
/ 02 января 2011

Интерфейсный Разработчик или загрузчик NIB не зависят от свойств, которые там будут. Если к подключенным переменным можно получить доступ через KVC, загрузчик пера может выполнить подключения.

Но вам действительно следует рассмотреть возможность использования синтезированных свойств вместо рукописных методов доступа. Это гораздо менее подвержено ошибкам, поскольку не требует большого количества стандартного кода. Чем меньше кода вы должны написать, тем лучше.

...