Ответ 1
Символы подчеркивания часто используются, чтобы показать, что переменные являются переменными экземпляра. Это не обязательно, так как ivars могут иметь то же имя, что и их свойства и их аксессоры.
Пример:
@interface MyClass : NSObject {
NSString *_myIVar; // can be omitted, see rest of text
}
// accessors, first one is getter, second one is setter
- (NSString *) myIVar; // can be omitted, see rest of text
- (void) setMyIVar: (NSString *) value; // can be omitted, see rest of text
// other methods
@property (nonatomic, copy) NSString *myIVar;
@end
Теперь вместо того, чтобы объявлять и кодировать аксессоров myIVar
и setMyIVar:
самостоятельно, вы можете позволить компилятору сделать это. В новых версиях вам даже не нужно объявлять myIVar
в интерфейсе. Вы просто объявляете свойство и позволяете компилятору синтезировать остальное для вас. В файле .m
выполните следующие действия:
@implementation MyClass
@synthesize myIVar; // generates methods myIVar and setMyIVar: for you,
// with proper code.
// also generates the instance variable myIVar
// etc...
@end
Обязательно завершите строку:
- (void) dealloc {
[myIVar release];
[super dealloc];
}
FWIW, если вы хотите сделать больше, чем стандартная реализация getter или setter, вы все равно можете скопировать одного или оба из них самостоятельно, но тогда вам также придется позаботиться об управлении памятью. В этом случае компилятор больше не будет генерировать этот конкретный элемент доступа (но если только один выполняется вручную, другой будет сгенерирован).
Доступ к свойствам осуществляется как
myString = self.myIVar;
или из другого класса:
theString = otherClass.myIVar;
и
otherClass.myIVar = @"Hello, world!";
В MyClass, если вы опустите self.
, вы получите голый ivar. Обычно это должно использоваться только в инициализаторах и в dealloc.