objective-c中的指针指针

时间:2012-08-31 20:52:26

标签: objective-c pointers

在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做同样的事情?

2 个答案:

答案 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 CountingTransitioning to ARC Release Notes - 特别是在后者中查找NSError,因为它解释了如何在NSError **下处理声明错误参数的常见模式ARC。

答案 1 :(得分:1)

你所拥有的代码已经很好了。如果Object实际上是一个obj-c对象,那么这个确切的代码就是你想要的。唯一的怪癖是潜在的内存管理问题(例如targetObj是否需要保留它所指向的东西?)