Синтезированное свойство уже выделено / инициализировано? - PullRequest
7 голосов
/ 15 августа 2010

Если у меня есть пользовательский класс NSObject с именем ProgramModel, получает ли он выделение / инициализацию, когда я @property и @synthesize передаю его из другого класса?Например, в классе ProgramController, подобном этому

// ProgramController.h
#import "ProgramModel.h"
@interface ProgramController : UIViewController {
    ProgramModel *programModel;
}
@property (nonatomic, retain) ProgramModel *programModel;

// ProgramController.m
#import "ProgramController.h"
@implementation ProgramController
@synthesize programModel;
// etc

Нужно ли также выделять / инициализировать в initWithNibName или viewDidLoad, или он уже alloc/init из-за property/synthesize

Ответы [ 3 ]

9 голосов
/ 15 августа 2010

Вам необходимо заполнить свойство вручную. Исключение составляют случаи, когда у вас есть IBOutlet property, который вы подключили в nib-файле; это будет заполнено автоматически при загрузке пера.

Я считаю, что для контроллеров представления подавляющее большинство свойств IBOutlets и свойств, которые описывают то, что будет отображать представление, а последний случай обычно задается объектом, который создает контроллер представления. Обычно это относится к контроллеру представления, который показывает подробное представление для некоторого объекта.

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

// simple lazy-loading getter
-(MyPropertyClass*)propertyName {
    if(propertyIvarName == nil) {
        propertyIvarName = [[MyPropertyClass alloc] init];
        // ... other setup here
    }
    return propertyIvarName;
}
6 голосов
/ 15 августа 2010

По умолчанию все переменные экземпляра обнуляются. В случае объектов это означает, что они nil. Если вы хотите получить начальное значение в свойстве, вы должны поместить его в метод инициализатора / viewDidLoad.

1 голос
/ 16 августа 2010
  • @property объявляет только методы получения / установки.
  • @synthesize генерирует только аксессоры для вас.

Им не присваиваются значения автоматически, за исключением обнуления памяти. Кроме того, вы должны установить их равными nil в -dealloc, чтобы избежать утечки.

Также не имеет смысла «выделять свойство». Свойство объекта является указателем. (И подумайте, что произойдет, если у вас есть связанный список классов ...)

(Примечание: атрибуты свойств также влияют на метод @synthesized, а свойства также известны среде выполнения; см. Class_copyPropertyList () и friends.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...