Это небезопасно, если вы не очень осторожны. Представьте себе следующий сценарий:
@interface BaseClass : NSObject
@property (readwrite) NSInteger twists;
@end
@interface SubClass : BaseClass {
struct something *aField;
}
@end
@implementation BaseClass
- (id)init {
self = [super init];
if (self) {
self.twists = 100;
// or
[self setTwists:100];
}
return self;
}
@synthesize twists;
@end
@implementation SubClass
- (id)init {
self = [super init];
if (self) {
aField = malloc(sizeof(struct something));
}
return self;
}
- (void)dealloc {
free(aField);
[super dealloc];
}
- (void)setTwists:(NSInteger)value {
[super setTwists:value];
aField->twists++;
}
@end
Если используется SubClass
, при создании экземпляра будет вызываться его реализация -setTwists:
, что будет разыменовываться aField
. В этот момент его инициализатор не был выполнен; инициализатор его суперкласса все еще выполняется. Сбой программы при разыменовании указателя NULL
.