Если вы просто собираетесь использовать ivar для внутренних целей и используете современную среду выполнения (Snow Leopard 64 bit и iOS 3.0+, я думаю), тогда вы можете просто объявить свойства в расширении класса и синтезировать их внутри класса. В вашем заголовке нет иваров, нет грязных id _internal
объектов, и вы можете обойти хрупкие ивары.
// public header
@interface MyClass : NSObject {
// no ivars
}
- (void)someMethod;
@end
// MyClass.m
@interface MyClass ()
@property (nonatomic, retain) NSString *privateString;
@end
@implementation MyClass
@synthesize privateString;
- (void)someMethod {
self.privateString = @"Hello";
NSLog(@"self.privateString = %@", self.privateString);
NSLog(@"privateString (direct variable access) = %@", privateString); // The compiler has synthesized not only the property methods, but also actually created this ivar for you. If you wanted to change the name of the ivar, do @synthesize privateString = m_privateString; or whatever your naming convention is
}
@end
Это работает с gcc от Apple, в дополнение к LLVM. (Я не уверен, что это работает на других платформах, т.е. не на gcc от Apple, но, безусловно, будет работать как для iOS, так и для Snow Leopard +).