实例变量仅在类内部可见

时间:2016-07-23 12:32:51

标签: ios objective-c

注意:我这里只讨论 .m 文件。

我对这两件事感到困惑,两者都被认为是宣告内部实例变量的方式:

方式1:

@interface MyClass ()
 // Declare instance variable which is only visible in this class
@end

@implementation MyClass
...
@end

方式2:

@implementation MyClass {
   // Declare instance variable which is only visible in this class
}
...
@end

这两种声明实例变量的方式有什么区别?

4 个答案:

答案 0 :(得分:0)

在功能方面,没有区别。

在类扩展中声明ivars - @interface MyClass() {...ivars...}@end模式 - 允许您将ivar声明移动到头文件,然后其他类可以将其用于直接访问以供内部使用,例如。

答案 1 :(得分:0)

" @ interface"你可以在花括号中添加实例变量。那个实例变量,而不是属性。花括号后,或紧跟在" @ interface"之后如果没有花括号,则添加方法和属性。

所以你的第一个评论是错误的。实例变量只能在花括号中添加。属性生成实例变量(通常但不总是),但它们不是实例变量。

答案 2 :(得分:0)

除了ivar之外,如果需要,属性还会生成setter和getter方法(根据属性属性)。但是如果你同步实现setter和getter,编译器就不会合成ivar,因为编译器会认为你正在控制属性实现,并且不会自动合成一个实例变量。

答案 3 :(得分:0)

Objective C { }中,它是您声明实例变量的区域。您还可以在该部分中使用访问成员声明,​​例如@private @ public& @protected。当你宣布" ivars"在{}之外,变量将是一个文件范围变量(静态类型),它不会成为您类的实例变量。

如果使用属性(@property),编译器就足够聪明,并将使用相应的setter和getter创建自己的ivars。

在实现文件中使用类扩展允许您添加只能通过类扩展的实现访问的ivars或属性(和方法)。它还允许您覆盖基类的访问,如属性或私有方法。