• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 关联对象与属性与实例变量之间的区别

[复制链接]
菜鸟教程小白 发表于 2022-12-13 11:26:09 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我一直在研究一些 Objective C 运行时方法,想知道关联对象和属性之间有什么区别。

我最感兴趣的是它们的底层实现和动态使用其中一个的优缺点,如果一个调用另一个,或者它们是否以任何方式相互关联。

这些是添加每个的三个运行时方法:

class_addProperty (Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount) 

对比

objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy).

class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment, const char *types)



Best Answer-推荐答案


立即想到的答案是它们完全不同,但我明白为什么有人可能会混淆。

属性

在 OOP 中,一般来说,propertyinstancemethod,它提供 interface 到读取和/或写入特定的数据成员。

在 Objective-C 中,@syntheisze 指令用于指示编译器创建或指定获取和/或设置类实例的某些数据成员的方法。方法本身通常被称为“getter”和“setter”。

要记住的重要一点是属性是美化的方法。

另一方面,实变量在物理上被赋予空间(内存)来存储它们的数据。假设我们有一个类 NSPerson:

@interface NSPerson : NSObject

@property (nonatomic, copy, readwrite) NSString *chosenName;
@property (nonatomic, copy, readonly) NSString  *givenName;
@property (nonatomic, copy, readonly) NSString  *fullName;

@end

@implementation NSPerson

@synthesize chosenName = _chosenName, givenName = _givenName

- (NSString *)fullName {
    return [NSString stringWithFormat"%@ %@", self.chosenName, self.givenName];
}

@end

在这种情况下,@synthesize 指令执行以下操作:

  • 创建一个名为 _chosenName
  • 的变量
  • 创建一个返回 _chosenName
  • 的方法 - (NSString *)chosenName
  • 创建一个方法 - (void)setChosenNameNSString *)chosenName_chosenName 设置为输入
  • givenName
  • 执行与上述相同的三件事
  • fullName 没有任何作用

现在,fullName 不需要自己的内存,因为它没有任何东西要存储。出于同样的原因,它也不需要二传手。因为它是只读的,并且我们明确提供了 fullName实现,所以我们完成了 - fullName 是一个非常好的属性,因为它是一种方法,1) 不接受任何参数,2) 吐出预期的类型。

关联对象

虽然属性几乎是所有主要 OOP 语言的一部分,但 Apple 提供的关联对象对 Objective-C 来说是相当独特的。

一个更好的问题应该是:字段(或实例变量)和关联对象之间有什么区别? p>

字段和关联对象都保存数据 - 与方法/属性不同,它们只是 返回 数据 - 两者都可以绑定(bind)到特定实例。

我认为关联对象的方式是类比。您之前可能已经处理过一些 JSON。 JSON 对象如下所示:

var data = {
    balance: 15.04,
    mood: 'hungry',
    friends: [
         'larry',
         'momed',
         'zeus',
    ]
}

现在,每个键:例如 balance 都与一个值配对。在这个类比中,键是实例变量。

关联的对象可能在哪里?

var associated = {};
var assc = associated[data] = {};  // the INSTANCE data is the KEY of the ASSOCIATIVE ARRAY
assc.extrra = "peekaboo";

我意识到这不是一个完美的类比,但我希望它能够理解上面的 associated 就像允许关联对象的 Objective-C 运行时的实现 - 以及关联对象是变量而不是方法。

编辑:为什么要关联对象?

我的gas用完了,但我想提一下,关联对象的主要用途是back categoriesextensions 中的属性不能使用传统字段来存储数据。就 Objective-C 而言,这是两者之间通常的联系。

关于ios - 关联对象与属性与实例变量之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31917770/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap