请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于关联对象的问题

老师你好,对于关联对象那里我有一个问题:
关联对象为什么要用一个全局的容器进行存储,为什么不直接存储到对应的被关联对象上呢?是不是考虑到解耦?职责单一原则?是这样的吗?

正在回答

1回答

对象的内存布局事先准备好的,已经没法改变了,可以关注下系统怎么查找成员变量值的,给你一个提示,是根据相对地址偏移量查得

0 回复 有任何疑惑可以回复我~
  • 提问者 滨滨_0 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-12-24 09:12:50
  • 老师在请教下,既然内存布局已经确定
    1.为什么分类的同名方法又可以拼接到原类的方法前面
    
    2.根据分类的数据结构可以知道,系统为分类支持了 实例方法,类方法,属性和协议,为什么实例变量不能像添加以上( 实例方法,类方法,属性和协议)的方法来添加实例变量呢?
    
    非常感谢?
    回复 有任何疑惑可以回复我~ 2019-06-03 23:58:30
  • 在 Objective-C 中,实例变量(ivars)的偏移值确实是在编译时确定的,而方法(使用 `category` 或 `class_addMethod`)可以在运行时动态添加。这种设计差异基于以下几个原因:
    
    1. 内存布局的稳定性:
       对象的内存布局在编译时确定是为了保证对象的大小和实例变量的位置在对象的生命周期中是固定的。如果允许在运行时动态添加实例变量,那么可能需要重新分配对象的内存,这会引入大量的复杂性,并可能导致指向旧对象的指针失效。
    
    2. 性能:
       直接使用固定的偏移量来访问实例变量是非常快速的,因为这只涉及简单的地址计算。如果实例变量可以在运行时动态添加,那么访问它们可能需要更复杂、更慢的查找机制。
    
    3. 简化模型:
       限制实例变量的添加简化了 Objective-C 的对象模型。允许在运行时动态添加实例变量会引入许多复杂的问题,例如:如何处理已存在的对象实例?新添加的实例变量的默认值是什么?如何处理对象的归档和解档?
    
    4. 方法与实例变量的不同:
       方法只是函数指针,并存储在类的方法列表中,而不是在每个对象实例中。添加新方法不会影响已存在的对象的大小或内存布局。而实例变量是对象状态的一部分,存储在每个对象实例中,所以其内存布局的考虑因素与方法不同。
    
    尽管如此,Objective-C 运行时确实提供了一些高级功能,如关联对象(Associated Objects),它允许你在运行时动态地将值与特定的对象实例关联。这可以用作在运行时为对象添加“实例变量”的代替方法,但其性能和直接访问实例变量的性能相比可能会较低。
    回复 有任何疑惑可以回复我~ 2023-09-02 21:23:46
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信