0

Когда у вас есть один объект как свойство другого объекта в Objective-C, он автоматически инициализируется при использовании @synthesize?Объект автоматически инициализируется, если он является синтезируемым свойством другого объекта?

+0

Ваш объект должен быть сохранен как указатель, который будет инициализирован на 'nil' – Dave

ответ

-1

Вы все еще должны инициализировать. Попробуйте использовать ленивую инициализацию:

-(MyPropertyClass*)propertyName { 
if(!propertyIvarName) { 
    _propertyIvarName = [[MyPropertyClass alloc] init]; 
} 
return propertyIvarName; 
} 

или инициализировать свойство в viewdidload

+0

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

+1

Это также может привести к проблемам, если свойство вызывается из нескольких потоков. –

+3

'viewDidLoad' не применяется к вещам, которые не являются представлениями ... – Dave

0

№ машины @synthesize не знает, как инициализировать его. Простой -init?

Вы можете выделить и инициализировать его в -init… ссылочного объекта.

4

Автоматически инициализируется при использовании @synthesize?

Да, он инициализируется nil (не реальный объект не выделяется, однако - это инициализация указателя в смысле C слова, метод init является не называется).

Кстати, вы не должны даже @synthesize добиться такого поведения - все переменные экземпляра, даже те, которые не имеют соответствующего @property, автоматически инициализируются либо nil (в случае объектов), NULL (в случае других указателей) или 0 (в случае целых чисел и чисел с плавающей запятой) по времени выполнения Objective-C.

3

Давайте попробуем:

@interface TypicalObject : NSObject 

@property (nonatomic) NSNumber *numberProperty; 

@end 


@implementation TypicalObject 

@synthesize numberProperty; 

@end 

... 

TypicalObject *object = [[TypicalObject alloc] init]; 
NSLog(@"object.numberProperty = %@", object.numberProperty); 

Урожайность заявление журнала:

object.numberProperty = (null) 

Таким образом, нет, свойства не автоматически Instantiate. Однако все переменные экземпляра объекта начинаются с nil.

Смежные вопросы