Objective-c:参考ivar持久性?好主意?

时间:2012-08-24 18:34:30

标签: objective-c ios pointers reference

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

这是有效的吗?伊娃可能会移动吗?是否存在对象实例化对象在运行时移动而不知道程序的情况?或者,对象是否完全保留在创建它们的位置。如果是后一种情况,是否有任何理由不按照我的方式使用参考文件?

我正在使用ARC。

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

3 个答案:

答案 0 :(得分:3)

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

请注意,指向另一个对象的insntance变量通常是一个非常糟糕的主意。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

假设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,因为它的实现可能会改变。