注意:我这里只讨论 .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
这两种声明实例变量的方式有什么区别?
答案 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或属性(和方法)。它还允许您覆盖基类的访问,如属性或私有方法。