如果我向 ViewController 添加一个属性
@property (strong, atomic) UIView *smallBox;
并将其合成到.m
文件中,该变量实际上可以被任何实例方法中的smallBox
引用。
但是,self.view
不能被 view
替换,即使 view
也被定义为 UIViewController 的属性。为什么有区别,规则是什么?
最佳答案
self.view
和 view
/_view
不是一回事。根据您创建实例变量的方式,view
或 _view
引用实际的对象实例变量。直接访问它是危险的,您应该只在 init
、dealloc
或访问器中这样做。在其他任何地方,您都应该使用 self.view
。
self.view
与[self view]
完全相同,它将消息“view”传递给对象“self”并返回结果。默认情况下,当对象接收到消息时,它会执行具有该名称的方法,view
的默认实现将返回相关实例变量的值(view
或 _view
)。
在旧版本的 Xcode 中,@synthesize view
会创建一个名为 view
的实例变量。在最新版本的 Xcode 中,声明属性 view
将在许多情况下自动创建一个名为 _view
的实例变量,即使没有 @synthesize
。此更改使您在直接访问 ivar 时更容易注意到。
简而言之:
- 除了
init
、dealloc
和view
访问器(如果您自定义编写它们),始终使用self.view
。 - 在这些方法中,您应该将其称为
_view
。 - 如果您正在为最新的 Xcode 编写代码,则根本不要包含
@synthesize
。如果您正在为稍旧的 Xcode 编写代码,请使用@synthesize view=_view;
self.view
并不表示“实例变量的值”。意思是“传递消息'view'的结果”,一般实现为返回实例变量。
关于objective-c - 在 Objective-C 中,我们是否必须使用 self.var 或仅使用 var 来引用 self 的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12223939/