在@interface中声明ivar与在.m文件中的@implementation中放置变量之间有什么区别?
@interface MyClass : NSObject { int num; } - (void)doSomething; @end
与
@implementation MyClass int num2; - (void)doSomething { num = 137; num2 = 138; } @end
有没有时间想要在@implementation中放置一个变量?
解决方法
使用ivar和在实现中声明变量之间的区别在于实现中的变量位于文件范围和全局.这意味着所有实例(和任何静态方法)将共享同一个变量;即如果您的对象的一个实例更改了该变量,它将为所有实例更改它.
在文件范围定义它的用例是为静态方法存储内容(直接作用于类而不是类的实例的方法).一个真正常见的用例是Singleton设计模式.您可以在此文件中定义类的静态实例,以便您可以随时确保访问同一实例.您可以提供一个返回此实例的静态方法,以便代码中的任何对象都可以通过直接在您的类上调用该方法来访问该对象.
2014年4月17日更新
现在常见的做法是使用Properties.这会为你创建getter和setter,自动使类更具可扩展性(如果你决定改变一个属性的工作方式,也许你想把它改为总是可以动态计算,公共接口该课程不需要改变).
您可以使用private class extensions to declare “private” properties and methods.这可以保护某些属性和方法不被外部类访问.