0

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

4

2 回答 2

8

在 ARC 下,指向指针的指针并不是那么简单。

例如,当您声明一个实例变量时:

NSObject *someObject;

你隐含地声明:

NSObject * __strong someObject;

强指针。Strong 只是所有权限定符之一,您还可以有自动释放限定符。

现在以您的评论为例:

NSDate **targetDate;

你得到错误“指向非常量类型'NSDate *'的指针,没有明确的所有权”。这是因为 ARC 需要知道您的指针所指的指针的所有权资格(慢慢阅读!;-))。即 ARC 要求您将变量键入为:

NSData * 'some ownership qualifer' * targetDate;

一旦你解码了 C 的类型优先级规则,它就是一个“指向 NSDate 的‘某些所有权限定符’的指针”。

错误消息包括“非常量”,因为这完全是关于通过指向指针的指针进行写入- ARC 仍然需要知道如何处理存储,这取决于指向的引用是强还是弱等。

在您的简单情况下,应该执行以下操作:

NSObject *obj1;
NSObject *obj2;
NSObject * __strong * targetObj;

然后在执行(*targetObj) = ...等操作时,ARC 知道如何进行内存管理——在这种情况下,就是释放所引用变量中的旧值,targetObj并将新引用分配给该变量。

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

于 2012-08-31T22:31:01.903 回答
1

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

于 2012-08-31T20:56:59.720 回答