黑马程序员 关于一个ARC引发的问题

---------------------- <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 
通过声明之后,这个指针就可以在ARC的环境下内存管理(有关于内存管理所有权问题请看之后的内存管理)。

我的错误在于把一个__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>、期待与您交流! ----- -----------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值