改成这样:
@implementation MyClass
NSString *testVar;
@end
至:
@implementation MyClass {
NSString *testVar;
}
@end
并且您将获得您所期望的内容。
正如您当前所写的代码,您实际上正在创建一个全局变量。由于连接器将两个全局变量合并为一个,因此在设置其中一个变量时,两者都会改变。使用花括号中的变量将成为一个适当的(且私有的)实例变量。
编辑:在被无缘无故地投票后,我想指出“旧”的做法和新的做法。
旧的方式:
SomeClass.h
@interface SomeClass : UIViewController <UITextFieldDelegate> {
UITextField *_textField;
BOOL _someBool;
}
@property (nonatomic, assign) BOOL someBool;
@end
SomeClass.m
@implementation SomeClass
@synthesize someBool = _someBool;
@end
现在,使用现代的Objective-C编译器的全新改进方式:
SomeClass.h
@interface SomeClass : UIViewController
@property (nonatomic, assign) BOOL someBool;
@end
SomeClass.m
@interface SomeClass () <UITextFieldDelegate>
@end
@implementation SomeClass {
UITextField *_textField;
}
@end
新的方式有几个优点。主要的优点是,与类相关的所有实现细节都不会出现在.h文件中。客户端没有必要知道实现需要哪些代理。客户端也不需要知道我使用了哪些实例变量(ivars)。现在,如果实现需要一个新的ivar或者需要使用一个新的协议,.h文件不会改变。这意味着需要重新编译的代码更少。它更加清晰和高效。这也使得编辑更加容易。当我在编辑.m文件,并意识到我需要一个新的ivar时,在同一个正在编辑的.m文件中进行更改即可。无需来回切换。
还请注意,实现不再需要为属性使用ivar或者@synthesize了。