“财产有 ivar 支持”?这在技术上意味着什么?

2024-02-24

所以...我对 Objective C 还很陌生...拿一些 iTunes U corses...做一些练习等等...

但是当您使用 @synthesize myProperty = _myIvarPropertyNameToUse; 时... iOS 5 将创建一个 ivar 来“支持”该属性。

就记忆中的位置而言,这里到底发生了什么......

(1) ivar 是真变量吗? ...或者它是指向对象中属性位置的指针?

(2) 该属性位于堆上(作为对象的一部分),对吗? ivar 也在堆上吗?

我想我可能会失去大局……拥有伊瓦尔支持的财产有什么意义?

thanks,


Objective-C 对象只是在堆上分配的 C 结构体(或多或少)。当您声明实例变量 (ivar) 时,它被定义为该结构的偏移量。因此,如果您像这样手动声明一些 ivars(不再这样做,但它说明了这一点):

@interface Foo : NSObject {
   NSString *ivar1;
   NSString *ivar2;
}

然后当你+alloc一个新实例(称之为foo),该结构将是一些标头,后面是 NSObject 的 ivars,后面是内存ivar1接下来是记忆ivar2. ivar1将是foo点加上一些偏移量。 (这不再完全正确,但请听我说;更容易理解旧的实现。)

Since foo是一个指向结构体的指针,你实际上可以直接引用这个偏移指针:foo->ivar1。它确实是一个结构。永远不要这样做,但这是合法的语法。

里面的@implementation block, ivar1会自动翻译为self->ivar1。不用太担心如何self已实现,但请相信它是指向您的结构的指针。再次强调,永远不要使用这个->句法。这是一个底层的实现细节(并且不再总是可能的;见下文)。

好的,这就是 ivar。在过去(ObjC 1.0),这实际上就是我们所拥有的一切。您声明了 ivars,然后手动创建了可设置并返回其值的访问器方法。

然后 ObjC2 出现了,在某些情况下它还为我们提供了一种称为非脆弱 ABI 的东西。这在某种程度上改变了 ivars 的底层实现,所以你不能总是实际使用->不再了。但无论如何你都不应该使用它。即便如此,假装事情还是老样子还是比较简单。更重要的是,ObjC2 添加了一个称为“属性”的新东西。属性只是实现某些方法的承诺。所以当你说:

@property (nonatomic, readwrite, strong) NSString *property;

这几乎与下面的说法相同:

- (NSString *)property;
- (void)setProperty:(NSString *)aProperty;

(差异很少很重要。)请注意,这不提供实现。它不会创建 ivars。它只是声明了一些方法。

现在在 ObjC1 中,我们一遍又一遍地编写相同的访问器代码。您有 20 个可写的 ivars,编写了 40 个访问器方法。而且它们几乎一模一样。有很多搞砸的机会。还有很多乏味的事情。感谢上帝配饰 http://www.kevincallahan.org/software/accessorizer.html.

使用 ObjC2,如果您添加了,编译器将免费为您提供最常见的实现@synthesize。它会自动创建一个与属性同名的 ivar,并编写一个 getter 和(如果需要)setter 来读取和写入该 ivar。通过=_property只是更改所使用的 ivar 的名称。我们称之为“支持 ivar”。

现在,在最新版本的编译器中,您甚至不需要@synthesize。这种模式非常常见,并且已经存在了几十年,以至于现在它已成为默认模式,除非您告诉编译器不要这样做。它会自动合成带有前导下划线的 ivar(这是最佳实践)。

您应该了解的另一条信息是,您应该始终使用访问器来访问 ivar,即使是在对象内部。唯一的例外是init and dealloc方法。在那里您应该直接访问 ivar(使用前导下划线)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“财产有 ivar 支持”?这在技术上意味着什么? 的相关文章

  • 将数组从控制器传递到视图

    I have UIView UI视图控制器 在 UIViewController 中 我需要能够将项目插入到 6 个整数的固定数组中 然后 我需要将此数组传递给视图 以便它分析该数组并适当地更新屏幕 我该怎么做呢 我尝试过使用标准 C 数组
  • 如何在 Java 9 中使用新的 BeanInfo 注解

    JEP 256 BeanInfo 注释 http openjdk java net jeps 256为JavaBean http download java net java jdk9 docs api java beans JavaBea
  • ObjC 中的 self 是什么?我应该什么时候使用它?

    什么是self在 Objective C 中是什么意思 我应该何时何地使用它 是否类似于this在Java中 self指的是您正在使用的当前类的实例 是的 它类似于this在爪哇 如果您想对该类的当前实例执行操作 则可以使用它 例如 如果您
  • Objective-C 字符串文字的预处理器宏值

    我在构建设置中定义了一个预处理器宏 FOO BAR 我想将该值转换为可以传递给方法的 Objective C 字符串文字 以下 define 不起作用 但它应该展示我想要实现的目标 define FOOLITERAL FOO want FO
  • Cocoa - 在另一个 xib 上显示 xib

    谁能告诉我如何 或指导我有关信息 在另一个 xib 笔尖 上显示 xib 笔尖 我希望如何放置它 以便我可以以编程方式将它移动到主笔尖 就像这样 这显然不起作用 void drawRect NSRect dirtyRect NSRect c
  • XCODE:如何从设备获取/验证准确的时间戳

    在没有互联网连接的情况下是否可以获得 NTP 或准确的时间戳 我不能接受 不信任带有 NSDate date 的设备时间戳 因为它可以由用户修改 并且我的应用程序将通过修改系统日期和时间而被黑客攻击 除此之外 是否有任何方法可以检查系统日期
  • 如何命名一段代码并在不同的方法中调用它?

    我使用 Grand Central Dispatch 方法在队列中执行我的应用程序 我在该队列的计算中决定按钮的框架 我希望我的应用程序重新绘制其屏幕并计算旋转后的新帧 这是我所做的一些伪代码解释 CGFloat a 123 b 24 di
  • 如何在ios上定义可达性超时

    我使用 Reachability 类来了解我是否有可用的互联网连接 问题是当wifi可用但不能上网时 NetworkStatus currentReachabilityStatus方法花费太多时间 my code Reachability
  • Xcode 4 Core Data:如何使用在数据模型编辑器中创建的获取属性

    如何在 Xcode 4 中实现获取的属性 Here is an example of two entities a book and a page 我按照此处的指南创建了一个获取的属性 该属性使用变量 FETCH SOURCE 引用来自源实
  • 空 NSDatePicker

    你好 是否可以让 NSDatePicker 代表 nil 对象 类似 或任何其他方式 谢谢 拉杜 简短回答 否 NSDatePicker 只是忽略无效日期和 nil 例如 这不会更新 NSDatePicker 旧值仍然存在 datePick
  • F# nameof 运算符不是一等函数

    我正在使用 F 4 7
  • 无法在 iOS UIWebView 中加载完整的 Facebook 评论插件

    我有一个简单的ViewController在 UIWebView 中加载 FB 评论插件 implementation ViewController void viewDidLoad super viewDidLoad UIWebView
  • UITableView 无法一直滚动到底部[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我只是好奇 我做了一些UITable
  • 永远不会在 ios 的 google API 中获取上传数据进度

    我在我的应用程序中使用 Google Drive API 从我的应用程序上传文件 到目前为止 我成功了 并找到了上传所有类型文件的良好结果 我跟着谷歌示例 https developers google com drive examples
  • UIView 和 UITableView 中的 UITapGestureRecognizer 冲突

    我有一个UIView我在其中添加了一个UITapGestureRecognizer 在该视图中 我还有一个子视图 其中基本上是某种UITableView 问题是为什么不UITableView识别连续点击 而是始终转到点击手势识别器的处理程序
  • 小视频播放

    根据我从互联网收集的信息 MPMoviePlayerController 类不支持小视频播放 因此 为了死马当活马医 我想知道可以使用什么样的方法来让小视频在屏幕的一角播放 而不中断屏幕的其余部分 到目前为止 我们已经遇到了两种可行的解决方
  • Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“无法导入桥接标头”

    我的 Xcode 项目构建并运行良好 它有 Swift 和 Objective C 代码 它已安装 GPUImage 我向它添加了单元测试 现在它将不再编译 找不到 GPUImage h 文件 导入桥接标头失败 以下是我发现并尝试过的解决方
  • 在后台每 X 分钟执行一次函数不起作用

    我使用此代码每 X 分钟执行一次函数 void executeEveryOneMinute self myFunction dispatch after dispatch time DISPATCH TIME NOW int64 t 60
  • 如何从 UILabel 创建图像?

    我目前正在 iPhone 上开发一个简单的类似 Photoshop 的应用程序 当我想要展平图层时 标签位于良好的位置 但字体大小不佳 这是我要展平的代码 UIGraphicsBeginImageContext CGSizeMake wid
  • Objective-C 使用字符串池吗?

    我知道Java https stackoverflow com questions 3801343 what is string pool in java and C http msdn microsoft com en us librar

随机推荐