我是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指令之前在文件的顶部定义它们.
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)
然后,您可以使用类方法与变量进行交互,它显然是特定于类的(与特定于实例或全局相反).
如果在@implementation部分中声明一个变量,那么实际上你创建的是一个全局变量,在任何地方都可见(在应用程序的每个方法中).
成员变量只能在@interface部分声明.它们只能在课堂上访问.