разница между object.variable и object-> variable - PullRequest
0 голосов
/ 12 марта 2011

Какая разница в использовании object.variable и object->variable?Когда я должен использовать object->variable?

Ответы [ 4 ]

3 голосов
/ 12 марта 2011

Поскольку Objective C является надмножеством C при использовании синтаксиса '-> (который похож на (* obj) .var), вы обращаетесь к переменной экземпляра (ivar), как в C-структуре (ну, классы в ObjCпросто причудливые C-структуры).

Таким образом, используя '.'подразумевает, что вы получаете доступ к собственности.Свойства - это функция, которая была добавлена ​​в Objective C 2.0 и позволяет вам получить доступ к вашим иварам с помощью методов установки / получения, которые могут быть созданы автоматически (с помощью @synthesize) или вы можете предоставить собственную реализацию.Кстати, для свойств совершенно не обязательно иметь соответствующий ivar.Например, в @interface вы объявляете:

@interface Ololo : NSObject {
//NOTE: there is no ivar named someText or _someText or whatever you want
}

@property(nonatomic) NSString* someText;
@end

Затем в @implementation:

@implementation Ololo
@dynamic someText; //we're using this to tell compiler that we will provide getters/setters ourselves and it doesn't need to generate them (though it is not necessary to do that)

-(NSString*) someText {
    return [NSString stringWithContentsOfFile: @"some_file_path"]; //we actually get value from file
}

-(void) setSomeText:(NSString*) str {
   [@"asdas" writeToFile: @"some_file_path" atomically: YES];
}

@end

На самом деле вы можете делать все, что хотите в этих методах.Таким образом, используя «.»просто ярлык для [obj setSomeText: @"hello"].

2 голосов
/ 12 марта 2011

Оператор косвенного обращения (->) унаследован от C и может использоваться как сокращение для доступа к полям в структуре, на которую у вас есть указатель.

Как пример ...

typedef struct IPhone {
    int serialId;
} IPhone;

Здесь у меня есть традиционная структура C, которую я могу создать следующим образом ...

IPhone *phone = (IPhone*)malloc(sizeof(IPhone));

Теперь, чтобы получить доступ к ее полям, я могу сделать это далеко ...

*(phone).serialId = 1123432324;

Или я могу использовать сокращенный оператор косвенности ...

phone->serialiId = 1123432324;

В основе каждого класса ObjectiveC лежит структура C.Итак, что вы делаете, когда используете оператор косвенности, - это возвращаетесь к старому синтаксису C, чтобы зайти в базовое представление.Это работает, но это не предписанный способ ObjectiveC.

2 голосов
/ 12 марта 2011

object-> variable - прямой доступ к переменной. object.variable - это вызов метода метода доступа геттера ' - (id) переменная ' или метода доступа метода set ' - (void) setVariable: (id) значение 'в зависимости от контекста.Вы должны сами написать методы доступа или использовать @synthesize для их генерации, чтобы использовать точечный синтаксис.

Хорошая практика программирования требует, чтобы вы всегда использовали методы доступа для доступа к переменной экземпляра из другого экземпляра.т.е. не использовать ->

2 голосов
/ 12 марта 2011

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

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