objective-c中的指针指针

Kyl*_*yle 0 pointers objective-c

在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
}
Run Code Online (Sandbox Code Playgroud)

我想知道obj-​​c是否有办法用NSObjects做同样的事情?

CRD*_*CRD 8

在ARC下,指针的指针并不那么简单.

当你声明一个实例变量时:

NSObject *someObject;
Run Code Online (Sandbox Code Playgroud)

你隐含地声明:

NSObject * __strong someObject;
Run Code Online (Sandbox Code Playgroud)

即一个强大的指针.Strong只是所有权限定符之一,您也可以使用自动释放限定符.

现在以你的评论为例:

NSDate **targetDate;
Run Code Online (Sandbox Code Playgroud)

你得到错误"指向非const类型'NSDate*'没有明确的所有权".这是因为ARC需要知道指针指向的指针的所有权限定(慢慢阅读!;-)).即ARC要求您输入变量:

NSData * 'some ownership qualifer' * targetDate;
Run Code Online (Sandbox Code Playgroud)

一旦你解码了C的类型优先级规则,它就是"指向'某个所有权限定符'指向NSDate的指针".

错误消息包括"非const",因为这是关于通过指针指向写入 - ARC仍然需要知道如何处理存储,这取决于指向引用是强,弱等.

在您的简单情况下,以下内容应该:

NSObject *obj1;
NSObject *obj2;
NSObject * __strong * targetObj;
Run Code Online (Sandbox Code Playgroud)

在进行操作时,(*targetObj) = ...ARC知道如何处理内存管理 - 在这种情况下,它是在引用的变量中释放旧值,targetObj以及将新引用分配给该变量.

基本读数是自动引用计数转换到ARC发行说明 - 特别是NSError在后者中查找,因为它解释了如何NSError **在ARC下处理声明错误参数的常见模式.