Подтвердить что ты не робот

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 правило, в котором указано, что оно неверно, потому что в будущем классе может быть представлено иначе, чем указатель на структуру во время выполнения и т.д.?

Спасибо заранее!

4b9b3361

Ответ 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.