我正在尝试将iOS项目转换为ARC。
我正在使用某些文件的编译器标志。
但其中一个文件包含在如下方法中声明的变量:
aClass **obj;
关闭ARC后,会出错:
“没有显式所有权的指向非const类型的指针”
我可以通过这样做来消除警告:
aClass *__strong* obj;
就所有权而言,我认为这不是一个好的做法。
但是在非ARC环境中不存在错误。
我的问题简单如下:
如何在不使用*__strong*
的情况下从非ARC更改为ARC设置对象的声明?
即,如何在ARC下声明(或更改声明)aClass **obj
而不必使用*__strong*
,我相信我已经在某处读过这不是一个好习惯但是我忘了我读到的地方。
和
为什么不在非ARC环境下给出错误。
答案 0 :(得分:0)
TL; DR:您可能不希望指向指针,除非您可以避免它。在为您管理内存的系统下,这样做的设计非常糟糕。这个答案解释了更多:Pointer to a pointer in objective-c?。
在非ARC下,系统会保留/释放你,因此谁拥有指针并不重要。你是程序员,拥有它。在ARC土地中,系统需要知道何时保留或释放,并且它不能总是推断哪个类/对象对特定对象具有所有权。其他类可能需要引用,但声明它的类已经完成了对象。基本上,__strong
告诉声明类它应该负责管理指针。它以某种方式“覆盖”指针的所有权。所以这是一种绕过它的方法。解决问题的最佳方法是重构代码以不使用明确管理的内存,但是如果不可能/太难,你将如何修复它。