在c ++中我将执行以下操作,
Object* obj1;
Object* obj2;
Object** targetObj;
void SetTargetToObj1()
{
targetObj = &obj1;
}
void SetTargetToObj2()
{
targetObj = &obj2;
}
void ValueChanged()
{
//So if SetTargetToObj2() was called before ValueChanged() we
// would be changing some data on obj2
(*targetObj)->ChangeSomeData();
//or, we obj2 is null we could assign a new object to it via targetObj
(*targetObject) = new Object();
//now obj2 is pointing to our new object
}
我想知道obj-c是否有办法用NSObjects做同样的事情?
答案 0 :(得分:8)
指向指针的指针在ARC下并不那么简单。
当你声明一个实例变量时:
NSObject *someObject;
你隐含地声明:
NSObject * __strong someObject;
即。一个强指针。 Strong只是所有权限定符之一,您还可以使用弱和自动释放限定符。
现在以你的评论为例:
NSDate **targetDate;
你得到错误“指向非const类型'NSDate *'的指针,没有明确的所有权”。这是因为ARC需要知道指针指向的指针的所有权限定(慢慢阅读!;-))。即ARC要求您输入变量:
NSData * 'some ownership qualifer' * targetDate;
,一旦你解码了C的类型优先级规则,就是“指向'某个所有权限定符'指向NSDate的指针”。
错误消息包含“非const”,因为这是关于通过指针指向写的全部内容 - ARC仍需要知道如何处理存储,这取决于是否指向引用是强者,弱者等。
在您的简单情况下,应该执行以下操作:
NSObject *obj1;
NSObject *obj2;
NSObject * __strong * targetObj;
然后在执行(*targetObj) = ...
等时,ARC知道如何处理内存管理 - 在这种情况下,将释放targetObj
引用的变量中的旧值以及分配新引用进入那个变量。
基本阅读为Automatic Reference Counting和Transitioning to ARC Release Notes - 特别是在后者中查找NSError
,因为它解释了如何在NSError **
下处理声明错误参数的常见模式ARC。
答案 1 :(得分:1)
你所拥有的代码已经很好了。如果Object
实际上是一个obj-c对象,那么这个确切的代码就是你想要的。唯一的怪癖是潜在的内存管理问题(例如targetObj
是否需要保留它所指向的东西?)