改变这一点:
@implementation MyClass
NSString *testVar;
@end
致:
@implementation MyClass {
NSString *testVar;
}
// methods go here
@end
你会得到你想要的.
正如你所看到的,你实际上是在创建一个全局变量.链接器将这两个全局变量合并为一个,这就是为什么在设置一个全局变量时,这两个变量都发生了变化.大括号中的变量将是一个适当的(私有)实例变量.
编辑:在无缘无故被否决后,我想我应该指出"旧"的做事方式,以及新的做事方式.
老办法:
某个班级.H
@interface SomeClass : UIViewController <UITextFieldDelegate> {
UITextField *_textField;
BOOL _someBool;
}
@property (nonatomic, assign) BOOL someBool;
// a few method declarations
@end
某个班级.M
@implementation SomeClass
@synthesize someBool = _someBool;
// the method implementations
@end
现在,现代Objective-C编译器采用了新的改进方式:
某个班级.H
@interface SomeClass : UIViewController
@property (nonatomic, assign) BOOL someBool;
// a few method declarations
@end
某个班级.M
@interface SomeClass () <UITextFieldDelegate>
@end
@implementation SomeClass {
UITextField *_textField;
}
// the method implementations
@end
这种新方法有几个优点.主要的优点是,类的实现特定细节都不会出现在文档中.h文件.客户不需要知道实现需要什么.客户不需要知道我使用什么样的IVAR.现在,如果实现需要一个新的ivar,或者需要使用一个新的协议,那么.h文件不会改变.这意味着重新编译的代码更少.它更干净,效率更高.它还便于编辑.当我编辑的时候.m文件并意识到我需要一个新的ivar,在同一个文件中进行更改.我已经在编辑m文件了.不需要来回交换.
还请注意,实现不再需要属性的ivar或@synthesize
.