开发者社区> 问答> 正文

NSMutableArray问题?报错

@property(nonatomic, copy) NSMutableArray *array;

self.array = [NSMutableArray alloc] initWithCapacipty:5];

[self.array addObject:@"hello"];

//大师们为什么上面这样写会报错啊

//如果像下面这样写就不报错了,这是为什么呀

_array = [[NSMutableArray alloc] initWithCapacipty:5];

[_array addObject:@"hello"];

展开
收起
爱吃鱼的程序员 2020-06-22 18:54:51 353 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    你这个应该会内存泄漏...array为copy用他的时候加了self. retaincount会加1... 回复<aclass='referer'target='_blank'>@Lemonfqm:你去了解下@property的属性copy本身是代表什么意思你就知道为什么了...回复<aclass='referer'target='_blank'>@lecai:我觉的这个运行报错似乎与内存泄露没有关系的!大师能不能给我解释哈啊?回复<aclass='referer'target='_blank'>@Lemonfqm:autorelease本身是有生命周期的...不是你用了就万事大吉...的确,是会发生内存泄露,如果我加了autorelease,运行时还是会蹦掉的啊!<divclass="ref">

    引用来自“lecai”的答案

    <divclass=ref_body>你这个应该会内存泄漏...array为copy用他的时候加了self. retaincount会加1... 的确copy回来的是不可变的,所以用点语法初始化会有问题,用_array初始化就没问题,之后就可以随便用self.array进行addobject了。

    <spanstyle="font-size:14px;line-height:22px;">楼主,你还是把代码贴全,这样看不出问题来。感觉有可能是其他地方的问题。

    你的.m里加了@synthesizearray了吗

    楼主还没弄透@property(我自己也是一知半解),你用self.array=是通过setter方法来给array赋值,而你又给这个setter方法设置copy,而经过copy生成的array指针指向的是一个不可变数组(详细请参见苹果的官方文档),这时你在调用add方法,肯定会出问题,而且Xcode会提示:unrecognizedselectorsenttoinstance” 

    至于_array为什么不报错,很简单,因为_array是一个变量,没有copy修饰,指向的还是你原来生成的可变数组,所以add方法有效。

    应经明白property这个属性了<divclass="ref">

    引用来自“银色Blues”的答案

    <divclass=ref_body>

    楼主还没弄透@property(我自己也是一知半解),你用self.array=是通过setter方法来给array赋值,而你又给这个setter方法设置copy,而经过copy生成的array指针指向的是一个不可变数组(详细请参见苹果的官方文档),这时你在调用add方法,肯定会出问题,而且Xcode会提示:unrecognizedselectorsenttoinstance” 

    至于_array为什么不报错,很简单,因为_array是一个变量,没有copy修饰,指向的还是你原来生成的可变数组,所以add方法有效。

    2020-06-22 18:55:07
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载