Arrow в objective-c
У меня есть вопрос, вот код:
@interface MyFoo : NSObject {
NSString *nameStr;
}
@end
@implementation MyFoo
- (id)init {
self = [super init];
if (self) {
self->nameStr = [@"some value of the string that is set right into the private ivar" copy];
}
return self;
}
@end
Вопрос: игнорирование всех правил С++, игнорирование уязвимости дампа памяти, почему именно я не должен использовать такой синтаксис оператора стрелки?
Есть ли где-то в документации Apple правило, в котором указано, что оно неверно, потому что в будущем классе может быть представлено иначе, чем указатель на структуру во время выполнения и т.д.?
Спасибо заранее!
Ответы
Ответ 1
Использование self->someIvar
идентично someIvar
. Это не так, но это тоже не нужно.
Единственный раз, когда я использую обозначение стрелки, - это реализация copyWithZone:
, поэтому я могу скопировать каждый из ivars, у которых нет свойств.
SomeClass *someCopy = ...
someCopy->ivar1 = ivar1; // = self->ivar1
someCopy->ivar2 = ivar2; // = self->ivar2
Где вы видите что-нибудь, что говорит, что вы не должны использовать такой синтаксис оператора стрелки?
Ответ 2
Использование обозначения стрелок только для имени ivar для доступа к объекту не гарантирует, что они будут сохранены, назначены или т.д....
Потому что вы направляете доступ к ivar, а не к вызову и setter ou getter, используемому в свойствах.
Пример:
@interface MyFoo : NSObject {
}
@property(nonatomic,retain) NSString *nameStr;
@end
@implementation MyFoo
- (id)initWithString:(NSString *)name {
self = [super init];
if (self) {
self->nameStr = name; // will not be retained
}
return self;
}
@end
Для переменных ivar, как уже есть ответ, нет ничего плохого.
Ответ 3
Использование обозначения стрелки не является неправильным, и существует разница между использованием стрелки и нотной точки. Если вы используете оператор стрелки, вы получаете доступ к переменной экземпляра, если вы используете оператор точки, вы получаете доступ к свойству.
Он не работает, как структуры C, где вы используете обозначение стрелки для доступа к члену структурированной точечной и точечной нотации для доступа к элементам структуры.
Поэтому я бы сделал примерный пример:
@property (nonatomic,strong) NSString* text;
В .m файле:
- (void) setText: (NSString*) string
{
NSLog(@"Accessing property");
self->text=string; // let suppose that text is not synthesized
}
Если вы используете точечную нотацию, то вы получаете доступ к свойству и печатаете "Доступ к свойству". Но это не связано с синтаксисом C structs.