0

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

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

我正在使用ARC。

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

4

3 回答 3

3

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

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

于 2012-08-24T18:42:51.330 回答
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,因为它的实现可能会发生变化。

于 2012-08-24T19:18:16.630 回答
0

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

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

于 2012-08-24T18:52:49.010 回答