我敢肯定,我在这里的困惑只是因为被困在"Java思维模式"中,不理解Obj-C在这种情况下有何不同.

在Java中,我可以像这样在一个类中声明一个变量,该类的每instance个变量都有自己的变量:

MyClass {

  String myVar;

  MyClass() {
    // constructor
  }
}

在Obj-C中,我试图通过仅在.m文件如下:

#import "MyClass.h"

@implementation MyClass

NSString *testVar;

@end

我在这里的期望是,这个变量的作用域仅限于这个类.所以我创建了第二个类(相同):

#import "MySecondClass.h"

@implementation MySecondClass

NSString *testVar;

@end

我看到(让我感到困惑的是)改变一个类中的变量会影响另一个类中的值.事实上,如果我设置了一个断点,然后"跳转到变量的定义",它会把我带到

我创建了一个非常小的Xcode项目来演示问题here.

推荐答案

改变这一点:

@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.

Objective-c相关问答推荐

如何从 Cocoa 的 NSDictionary 中获取特定键的值?

覆盖@property setter 和无限循环

如何追踪 SIGABRT 的原因

NSArray 添加元素

验证应用内购买的收据

NSTimeInterval 格式

在 NSData 和 base64 字符串之间转换

与 iOS 6.0 原生 Facebook 集成共享:通过我的应用名称发布?

在 iOS 设备上本地存储图像

指向方法返回类型的Expected a type错误

[Facebook-iOS-SDK 4.0]如何从FBSDKProfile获取用户邮箱

UITextView 禁用文本 Select

在 Xcode 5 中运行代码覆盖时出现数十个profiling:invalid arc tag

arc4random 和 arc4random_uniform 有什么区别?

当服务器上的图像文件更改时,我的应用程序中的 SDWebImage 缓存图像会发生什么情况?

如何删除应用程序可访问的所有 keys 串项目?

主队列上的 dispatch_sync 与 dispatch_async

如何让 UITextView 检测网站、邮件和电话号码的链接

如何调整 UITableView 中原型单元格的左边距?

@synthesized 保留属性的释放是如何处理的?