objective-c - 在 Objective-C 中,我们是否必须使用 self.var 或仅使用 var 来引用 self 的属性?

标签 objective-c ios

如果我向 ViewController 添加一个属性

@property (strong, atomic) UIView *smallBox;

并将其合成到.m文件中,该变量实际上可以被任何实例方法中的smallBox引用。

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

最佳答案

self.viewview/_view 不是一回事。根据您创建实例变量的方式,view_view 引用实际的对象实例变量。直接访问它是危险的,您应该只在 initdealloc 或访问器中这样做。在其他任何地方,您都应该使用 self.view

self.view[self view] 完全相同,它将消息“view”传递给对象“self”并返回结果。默认情况下,当对象接收到消息时,它会执行具有该名称的方法,view 的默认实现将返回相关实例变量的值(view_view)。

在旧版本的 Xcode 中,@synthesize view 会创建一个名为 view 的实例变量。在最新版本的 Xcode 中,声明属性 view 将在许多情况下自动创建一个名为 _view 的实例变量,即使没有 @synthesize。此更改使您在直接访问 ivar 时更容易注意到。

简而言之:

  • 除了initdeallocview 访问器(如果您自定义编写它们),始终使用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/

相关文章:

ios - 在 iOS 中播放视频失败

android - 将 Xamarin 组件添加到共享代码

ios - 刷新位置然后运行 ​​NSXMLParser

ios - 从 Delegate 方法刷新 UITableView Cell UI 按钮图像的问题

ios - 在 iOS 中读取 URL 的缓存问题

ios - 在给定时间捕获 AVPlayer 流 .m3u8 的 UIImage 帧?

ios - 如何添加具有等于 uitableview 约束的 searchResultsTableView?

ios - Realm 层次结构

ios - MFMailComposeViewController 强制图像附件的实际大小

objective-c - Mac OS X 10.8 : Replacement for Lock/UnlockPixels() for the cocoa applications