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

我是Objective-C的新手,但是对于其他地方我没有看到的东西我很好奇。

任何人都可以告诉我在@interface块中声明的私有variables与在类方法之外的@implementation块中声明的variables之间有什么区别,即:

 @interface Someclass : NSObject { NSString *forExample; } @end 

 @implementation Someclass NSString *anotherExample; -(void)methodsAndSuch {} @end 

似乎这两个variables( forExampleanotherExample )在整个class级中都是同样可以访问的,我不能真正发现他们的行为有什么不同。 第二种forms也称为实例variables?

后者没有定义一个实例variables。 而是在.m文件中定义一个全局variables。 这样的variables不是唯一的或者是任何对象实例的一部分。

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

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

 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. 

如果你正在寻找这样的行为,你可能会更好地使用类variables,如下所示:

 static NSString* yetAnotherExample = nil; 

然后你可以使用类方法与variables进行交互,而且它很明显是类特定的(而不是实例特定的或全局的)。

如果您在@implementation部分中声明了一个variables,那么实际上是创build一个全局variables,随处可见(在您的应用程序的每个方法中)。

成员variables只能在@interface部分中声明。 他们只能在课堂上使用。

@implementation块中声明的@implementation块是危险的,在我看来,与其他OOP概念比如Java比较。 它看起来像成员variables,但有点静态。

新手程序员可以很容易地愚弄它。 我写了一个testing程序,并且对这个行为感到惊讶。

 @interface SomeClass : NSObject { NSString *forExample; } - (void) set:(NSString *)one another:(NSString *)another; - (void)print; @end 

执行:

 #import "SomeClass.h" @implementation SomeClass NSString *anotherExample; - (void) set:(NSString *)one another:(NSString *)another { forExample = one; anotherExample = another; } - (void)print{ NSLog(@"One = %@, another = %@", forExample, anotherExample); } @end 

testing:

 - (void)testClass { SomeClass * s1 = [SomeClass new]; [s1 set:@"one one" another:@"one another"]; SomeClass *s2 = [SomeClass new]; [s2 set:@"two one" another:@"two another"]; [s1 print]; [s2 print]; } 

而输出是,

 One = one one, another = two another One = two one, another = two another 

为了清楚起见,如果您正在将它用于本地化的nib / xib,那么永远不要将IBOutlet声明为全局variables(在实现中)。

我花了几个小时来弄清楚为什么在任何时候只能在一个本地化的笔尖上连接sockets。

感谢这个问题和答案!