在我开发的最初几天,我开始总是在我编写的每个程序中创建实例变量。但是在了解了属性的力量之后,我觉得我们不需要使用 iVars。
但是有时当我不得不调试代码时,由于缺少 iVar,我发现调试自定义实体的值很困难。
现在我计划在所有自定义接口实现上使用 iVar。
请确认我一直在做的事情是否是一个好的做法,是否有取舍?
我们需要在 Objective C 中使用 iVar 是否还有其他原因?
在我开发的最初几天,我开始总是在我编写的每个程序中创建实例变量。但是在了解了属性的力量之后,我觉得我们不需要使用 iVars。
但是有时当我不得不调试代码时,由于缺少 iVar,我发现调试自定义实体的值很困难。
现在我计划在所有自定义接口实现上使用 iVar。
请确认我一直在做的事情是否是一个好的做法,是否有取舍?
我们需要在 Objective C 中使用 iVar 是否还有其他原因?
您不是通过使用属性来“不使用”iVar(大多数情况下)。您只是让编译器为您生成它们。我经常将私有和受保护的 iVar 用于我不想暴露给外部无关类(标志等)的东西。属性只是 iVar 加上定义的 getter(可能还有 setter)。我不明白您认为通过避免明确的 iVar 可以获得什么。
首先,您的属性总是由实例变量支持,除非您有一些动态运行时的东西(例如使用 的子类NSManagedObject
)或者该属性完全使用自定义 getter/setter 实现。
当您合成一个属性时,会为您创建一个实例变量。您可以在声明中显式声明实例变量@interface {}
,但不再需要这样做。
通常,您应该更喜欢使用属性而不是实例变量,但在某些情况下您必须直接访问实例变量。例如,init
方法的最佳实践是避免使用属性访问器来设置对象,因为子类可以覆盖属性访问器并尝试在对象完全初始化之前做一些事情。自定义 getter/setter 方法也需要直接使用实例变量。
当您声明属性和 @synthesize 语句时,编译器将注意在访问器方法中创建实例变量。请参阅此链接以获取更多信息我应该在 Objective-C 中使用 ivars 吗?