【问题标题】:Objective-c: Reference to ivar persistent? Good idea?Objective-c:引用 ivar 持久化?好主意?
【发布时间】:2012-08-20 08:10:45
【问题描述】:

我有一种情况,我需要保持对 ivars 的引用。在一个对象中,我有一组指向另一个对象中的 ivars 的指针,它们在程序的整个生命周期中使用。换句话说,我不只是传递一个引用来检索一个值——我保留了指针。

这是有效的吗?是否有可能 ivars 可能会移动?是否存在对象实例化对象在程序不知道的情况下在运行时移动的情况?或者,对象是否准确地停留在它们创建的位置。如果是后者,有什么理由不按照我的方式使用引用吗?

我正在使用 ARC。

注意:这可能不是一个很好的设计方法,但是......它已经完成并且工作了 99%! (除了重启整个手机的严重崩溃......)

【问题讨论】:

    标签: objective-c ios pointers reference


    【解决方案1】:

    对象及其实例变量一旦创建就不会移动。但是,您还需要保持对包含 ivar 的对象的强引用。否则,对象可能会被释放,留下一个悬空指针。

    请注意,使用指向另一个对象的实例变量的指针通常是一个非常糟糕的主意。

    【讨论】:

    【解决方案2】:

    假设 A 类的对象想要持久访问 B 类对象的 ivars(在您的示例中)。

    您通常所做的是在 A 类中创建一个属性(使用 strong 注释,如 @property (strong) ClassB *myBVar)来引用 B 类的对象。 如果要设置或读取 B 的属性,请使用点表示法或调用 getter/setter 方法:

    myBVar.name = @"Jim";
    NSLog(@"Name:%@",myBVar.name);
    
    [myBVar setName:@"Jim"];
    NSLog(@"Name:%@",[myBVar name]);
    

    你永远不要直接调用 ivar,因为它的实现可能会改变。

    【讨论】:

    • 我意识到我遗漏了一个非常重要的部分:A 类和 B 类都是在运行时实例化的。两者都可以有不同数量和类型的参数。当我试图传递对对象的引用时,代码变得复杂,让编译器不高兴。我举起双手,想我会用老式的指针。那么,问题来了:当两个对象都是匿名的并且具有不同的属性时,你如何“通过引用传递”,而这些属性都是在运行时确定的?
    • 对象(类的实例)通常在运行时创建。当您创建并初始化一个新的对象变量时,您已经创建了对该对象的引用(如ClassA *myVariable = [ClassA new])。我不明白匿名部分。你能展示一个失败的代码示例吗?
    【解决方案3】:

    虽然从外部访问 ivars 没有技术问题(如 rob 所述),但仍然需要考虑架构设计:您采用的方法打破了封装。此外,它在 Objective-C 中非常少见。

    所以关于代码的可维护性,我建议重构代码。在 Objective-C 中没有像 C++ 中那样的 friend 声明,因此从声明类外部访问 ivars 是不常见的。

    【讨论】:

    • 从功能上讲,一件事需要通过一个间接级别来保持对另一件事的引用。 (程序的元功能 - 具有讽刺意味的是 - 一个用户可编程系统,它使用一件事引用另一范式)所以,没有很好的方法来传递值。在这种情况下,传递“参考”的正确方法是什么?
    • 这些信息不足以提出好的建议,但如果您想访问一个对象的(公共)属性列表,则可以使用 KVC。
    • 这是一个动画系统,类似于 3D 图形软件(例如 Houdini 或 Maya)中使用的动画系统。您有一个对象链,这些对象在几何数据流动时对其进行处理。对象具有配置参数。诀窍是参数可以随时间变化(动画),并且它们本身是由非平凡的、与时间相关的对象生成的。它们通过向参数生成对象提供对表示该参数的几何处理对象中的 ivar 的引用来连接。所有这些都是动态的 == 没有关于连通性的假设。
    • 如果对象的参数可以在运行时更改,那么您可能需要考虑使用 NSMutableDictionary 作为 ivar/property。这样您就可以随意添加/删除键/值对。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多