您的位置:首页 > 其它

iPad/iPhone内存管理五之如何确定对象返回的值是autorelease

2012-04-29 20:57 471 查看
大家看看下面的区别:

NSString * sushiString =
[NSString stringWithFormat:@"%d: %@",
indexPath.row, sushiName];


NSString * sushiString =
[[[NSString alloc] initWithFormat:@"%d: %@",
indexPath.row, sushiName] autorelease];


下面是子龙山人叫给方法:

一、如果一个方法以init或者copy开头,那么返回给你的对象的引用计数是1,并且这不是一个autorelease的对象。换句话说,你调用这些方法的话,你就对返回的对象负责,你再用完之后必须手动调用release来释放内存。

二、如果一个方法不是以init或者copy开头的话,那么返回的对象引用计数为1,但是,这是一个autorelease对象。换句话说,你现在可以放心使用此对象,用完之后它会自动释放内存。但是,如果你想在其它地方使用它(比如换个函数),那么,这时,你就需要手动retain它了。

引用计数总结:

当你调用alloc/init的时候,你得到一个引用计数是1的对象。
当你用完这个对象之后,你要对它调用release消息,使其引用计数为0,这样它的内存才会被释放掉。
当你调用一个方法,它不是以init或者copy开头的,这时,返回给你的对象是autorelease的,它是一种在将来某个时刻会自动被释放的对象。(这里我也要提醒大家一句,比如你在写一个函数,它的名字是xxx,没有以init或者copy开头,那么记得你返回的对象一定要是autorelease的,否则,别人在使用你这个函数的时候就会把它当作是autorelease的,那么他就不会release它,这样就会造成内存泄漏,千万要切记!!!)
如果你想继续使用autorelease对象,那么你就要给它放送一个retain消息。
如果你使用alloc/init方法创建了一个对象,但是你想让它自己在出了runLoop之后被自动释放的话,那么你可以在alloc/init之后再调用autorelease。这也是一种见得比较多的写法了。比如,cocos2d里面调用[xxx node]的时候,就等于[[[xxx alloc] init]autorelease].
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: