如果我向 ViewController 添加属性
@property (strong, atomic) UIView *smallBox;
并在文件中合成它.m
,该变量实际上可以被smallBox
任何实例方法内部引用。
但是,self.view
不能被 替换view
,即使它也view
被定义为 UIViewController 的属性。为什么有区别,规则是什么?
如果我向 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
.@synthesize
。如果您正在为稍旧的 Xcode 编写代码,请使用@synthesize view=_view;
self.view
并不意味着“实例变量的值”。它的意思是“传递消息'view'的结果”,通常实现为返回实例变量。您不能view
直接访问该成员,因为它@package
在UIViewController
. 这可以防止您的代码访问它。(通常,无论如何您都不想直接访问超类的实例变量。)
对于您的类自己的属性,您可以直接访问实例变量,但您需要了解这对内存管理的影响。(同样,正如 Rob 所指出的,正如您通过避免访问器来回避的任何其他行为一样。)
Apple 定义的属性通常在其名称前包含一个下划线,因此当您使用 时self.view
,它实际上是_view
从对象中获取实例变量。您不能_view
在代码中使用,因为它会在编译时导致链接器错误,但 Xcode 仍会为您突出显示它。访问实例变量的另一种方法self.view
是 by self->_view
,但这同样会导致链接器错误。这些链接器错误的原因是编译的库不包含 ; 的符号_view
。即使它的声明可以在UIViewController.h
.