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做同样的事情?
在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下处理声明错误参数的常见模式.