在@implementation而不是@interface定义的类变量?

bit*_*her 41 objective-c

我是Objective-C的新手,但我很好奇我在其他任何地方都没有看过的东西.

谁能告诉我在@interface块中声明的私有变量与@implementation在类方法之外的块中声明的变量之间的区别是什么,即:

@interface Someclass : NSObject {

 NSString *forExample;

}

@end
Run Code Online (Sandbox Code Playgroud)

@implementation Someclass

 NSString *anotherExample;

-(void)methodsAndSuch {}

@end
Run Code Online (Sandbox Code Playgroud)

似乎两个变量(forExample,anotherExample)在整个班级中都可以同等地访问,我无法真正发现他们的行为有所不同.第二种形式也称为实例变量吗?

Nic*_*ore 30

后者没有定义实例变量.相反,它是在.m文件中定义一个全局变量.这样的变量不是任何对象实例的唯一或部分.

这样的全局变量有它们的用途(大致相当于C++静态成员;例如存储单例实例),但通常你会在@implementation指令之前在文件的顶部定义它们.

  • @bitcruncher因为`anotherExample`只是声明它的.m文件的全局.如果你想让它可用于其他文件,你必须在.h文件中声明`extern NSString*anotherExample;`,然后在需要全局的地方``import` .h文件.尽管它确实具有有效的用例,但这种代码气味仍然很大. (4认同)
  • 没有实际的代码闻起来:-)这只是一个探索性的问题. (4认同)

and*_*n22 23

他们非常不同!one in @implementation是一个不是每个实例唯一的全局变量.想象一下,这两个变量都有访问器,以明显的方式编写.然后在这里显示行为的差异:

Someclass* firstObject = [[Someclass alloc] init];
Someclass* secondObject = [[Someclass alloc] init];

//forExample is an instance variable, and is unique to each instance.
[firstObject setForExample:@"One"];
[secondObject setForExample:@"Two"];
NSLog(@"%@",[firstObject forExample]); //Result: "One"
NSLog(@"%@",[secondObject forExample]); //Result: "Two"

//anotherExample is a global variable, and is NOT unique to each instance.
[firstObject setAnotherExample:@"One"];
[secondObject setAnotherExample:@"Two"];
NSLog(@"%@",[firstObject anotherExample]); //Result: "Two" (!)
NSLog(@"%@",[secondObject anotherExample]); //Result: "Two"

//Both instances return "Two" because there is only ONE variable this time.
//When secondObject set it, it replaced the value that firstObject set.
Run Code Online (Sandbox Code Playgroud)

如果您正在寻找这种行为,最好使用类变量,如下所示:

static NSString* yetAnotherExample = nil;
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用类方法与变量进行交互,它显然是特定于类的(与特定于实例或全局相反).


Phi*_*ert 5

如果在@implementation部分中声明一个变量,那么实际上你创建的是一个全局变量,在任何地方都可见(在应用程序的每个方法中).

成员变量只能在@interface部分声明.它们只能在课堂上访问.