gpt4 book ai didi

Objective-C 实例变量?

转载 作者:IT老高 更新时间:2023-10-28 11:36:50 25 4
gpt4 key购买 nike

我确信我在这里的困惑只是因为陷入“Java 思维方式”而不理解 Obj-C 在这种情况下的不同之处。

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

MyClass {

String myVar;

MyClass() {
// constructor
}
}

在 Obj-C 中,我尝试通过仅在 .m 文件中声明一个变量来做同样的事情,如下所示:

#import "MyClass.h"

@implementation MyClass

NSString *testVar;

@end

我的期望是这个变量的范围仅限于这个类。所以我创建了第二个类(相同):

#import "MySecondClass.h"

@implementation MySecondClass

NSString *testVar;

@end

我所看到的(让我感到困惑)是在一个类中更改变量会影响在另一个类中看到的值。事实上,如果我设置一个断点,然后“跳转到定义”的变量,它会带我去th

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

最佳答案

改变这个:

@implementation MyClass

NSString *testVar;

@end

到:

@implementation MyClass {
NSString *testVar;
}

// methods go here

@end

你会得到你所期望的。

正如你所拥有的,你实际上是在创建一个全局变量。这两个全局变量被链接器合并为一个,这就是为什么当你设置一个时它们都改变了。花括号中的变量将是一个适当的(和私有(private)的)实例变量。

编辑:在无缘无故被否决后,我想我会指出“旧”的做事方式和新的方式。

老办法:

SomeClass.h

@interface SomeClass : UIViewController <UITextFieldDelegate> {
UITextField *_textField;
BOOL _someBool;
}

@property (nonatomic, assign) BOOL someBool;

// a few method declarations

@end

SomeClass.m

@implementation SomeClass

@synthesize someBool = _someBool;

// the method implementations

@end

现在是现代 Objective-C 编译器的新改进方法:

SomeClass.h

@interface SomeClass : UIViewController

@property (nonatomic, assign) BOOL someBool;

// a few method declarations

@end

SomeClass.m

@interface SomeClass () <UITextFieldDelegate>
@end

@implementation SomeClass {
UITextField *_textField;
}

// the method implementations

@end

新方法有几个优点。主要优点是关于类的具体实现细节都没有出现在 .h 文件中。客户端不需要知道实现需要什么委托(delegate)。客户不需要知道我使用什么 ivars。现在,如果实现需要一个新的 ivar 或者它需要使用一个新的协议(protocol),那么 .h 文件不会改变。这意味着更少的代码被重新编译。它更清洁,更高效。它也使编辑更容易。当我正在编辑 .m 文件并意识到我需要一个新的 ivar 时,请在我已经在编辑的同一个 .m 文件中进行更改。无需来回交换。

还要注意实现不再需要属性的 ivar 或 @synthesize

关于Objective-C 实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13263229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com