---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、
<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----- -----------------
关于一个ARC引发的问题
-----must be explicitly intended ownership of an object array parameter(必须明确目的对象数组参数的所有权)
今天遇到一个问题是关于在参数中利用对象数组做参数,虽然很简单,但是编译出现了问题。
刚开始我还以为是OC不能用数组做参数,但后来想,怎么可能,一门语言还会有这样的缺陷,肯定是哪里自己出错了,所以我又检查了一遍代码,发现没有什么问题,我想是不是代码逻辑有问题,但我用eclipse敲了下相类似的可以通过,我想是不是编译器有问题,由于傻不啦叽的就问了些为什么OC中不能用数组做参数、为什么Xcode不能用数组做参数。结果很明显没有得到我想要的(还真是一个小白)。过了很久我才想到把报的错误敲下发到网上问,must be explicitly intended ownership of an object array parameter,结果知道了解决方法,就是关掉ARC。如果不知道怎么关我可以写下:点击项目名称,中间的编译区会出现一些设置信息的界面,点击building setting,在搜索框中输入Automatic reference counter(可以不必全部输,输的过程会有提示的),双击将其中的YES改成NO就行了。于是我这样做了,结果也可以达到我的预期结果,但是这之后不是得自己管理内存了这样不是很不方便,再说这样的做的理由是什么呢??
我在网上找了半天,发现没有找到,哎!百度真心不行啊,于是我想用google试下,经验告诉我百度解决不了的google都帮我解决了,但是很伤心google用不了啊,谁叫我们是和谐的社会主义呢~没办法继续用百度,嘻嘻!功夫不负有心人,还真叫我找到了一些。是一个外文论坛:stackoverflow。全是英文,不过还好我还看的懂。大概是说在参数中用了一个指针类型的变量,所以我们必须在ARC环境中声明这个指针的所有权,一般又四中可选的参数:
- __strong
- __weak
- __unsafe_unretained
- __autoreleasing
我的错误在于把一个__Strong强引用给了一个__unsafe_unretianed(或者__weak)的弱引用的参数,说这样会影响指针的内存管理,弱指针是不需要release和retain的。所以必须是把它改成一个可以内存管理的参数形式即用__strong。
void drawShapes(__strong id shapes[], int count)
{
for(int i = 0;i < count;i++) {
id shape = shapes[i];
[shape draw];
}
}
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、
<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----- -----------------