4

如果我向 ViewController 添加属性

@property (strong, atomic) UIView *smallBox;

并在文件中合成它.m,该变量实际上可以被smallBox任何实例方法内部引用。

但是,self.view不能被 替换view,即使它也view被定义为 UIViewController 的属性。为什么有区别,规则是什么?

4

3 回答 3

10

self.viewview/_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 时更容易注意到。

简而言之:

  • 除了 ininitdealloc访问view器(如果您自定义编写它们),请始终使用self.view.
  • 在这些方法中,您应该将其称为_view.
  • 如果您正在为最新的 Xcode 编写,则根本不要包含@synthesize。如果您正在为稍旧的 Xcode 编写代码,请使用@synthesize view=_view;
  • self.view并不意味着“实例变量的值”。它的意思是“传递消息'view'的结果”,通常实现为返回实例变量。
于 2012-09-01T00:44:31.257 回答
1

您不能view直接访问该成员,因为它@packageUIViewController. 这可以防止您的代码访问它。(通常,无论如何您都不想直接访问超类的实例变量。)

对于您的类自己的属性,您可以直接访问实例变量,但您需要了解这对内存管理的影响。(同样,正如 Rob 所指出的,正如您通过避免访问器来回避的任何其他行为一样。)

于 2012-09-01T00:59:40.077 回答
0

Apple 定义的属性通常在其名称前包含一个下划线,因此当您使用 时self.view,它实际上是_view从对象中获取实例变量。您不能_view在代码中使用,因为它会在编译时导致链接器错误,但 Xcode 仍会为您突出显示它。访问实例变量的另一种方法self.view是 by self->_view,但这同样会导致链接器错误。这些链接器错误的原因是编译的库不包含 ; 的符号_view。即使它的声明可以在UIViewController.h.

于 2012-09-01T00:31:31.203 回答