4

我是 Objective-C 的新手,我不明白 MyClass.h 中变量(firstString、secondString 和 thirdString)的声明有什么区别:

@interface MyClass {
    NSString *firstString;
}
@end

在 MyClass.m 中:

@interface MyClass() {
    NSString *secondString;
}
@end

@implementation MyClass

NSString *thirdString;

@end

我猜第一种和第二种情况是一样的,但是在什么情况下使用比较好呢?

非常感谢!

4

3 回答 3

3

firstString在头文件中声明,该文件#import由其他类编辑。它暴露给其他类,因此可以被子类访问,并且由于该符号在头文件中可用,因此外部对象通过键值编码进行更改会更简单。

secondString在您的实现文件中声明。()in@interface MyClass ()表示这是一个类扩展secondString不会暴露给外部类(尽管与 Objective-C 中的所有内容一样,您不能认为它是真正私有的)。

于 2013-02-17T14:57:48.003 回答
2

第一个和第二个变量将是实例变量,而第三个将是文件范围的全局变量。通常,您应该使用实例变量并避免使用全局变量。

于 2013-02-17T14:53:57.627 回答
1

三者在功能上没有区别,主要是可见性控制。

  1. 第一个是在类的公共头文件中声明的,这意味着您希望程序员了解该变量。如果对该属性的访问受到限制(例如@private),它不应再出现在公共标头中,您应该使用第二个或第四个选项。

  2. 第二个是在类延续中声明的,这意味着只有实现才需要它。

  3. 第三个是全局变量,你应该只在特殊情况下使用它。

  4. 缺少另一个选项

@implementation MyClass {
    NSString *thirdString; 
}

@end

(最新的 Apple 编译器允许)与 2 相同,无需创建类延续。

于 2013-02-17T14:59:02.423 回答