内存管理 accessor method 里的 reference count

苹果adc文章
stepwise 的文章

accessor methods



example 1:  set method:

- (void)setTitle:(NSString *)newTitle
{
    [title autorelease];
    title = [newTitle copy];
}


example 2: copy

NSMutableString *foo = [NSMutableString stringWithCString:"foo"];
[myWindow setTitle:foo];
[foo appendString:@"bar"];



  •  To copy还还还or to retain?     

 value objects - 对象封装了离散的,有限的数据, 如 NSNumbers ,NSStrings.
copy - 需要对象的快照 snapshot 给自己。
retain-需要共享对象时。
entity objects - 对象很大,而且有下层对象。 如 NSView, NSWindow.
retain- 永远。

 Value Objectentity object
copy
需要对象的快照 snapshot 给自己。对象必须符合 NSCopying 协议。
n/a
retain
需要共享对象时
永远




例1 中将传递过来的newTitle 被copy , 而不是 retain, 因为只想要一个nsstring 对象的拷贝,而不是要共享他,
title 先被release , 因为title 指向了一个NSString 对象, 如果不autorelease,将失去这个对象。一旦title 被指向新的NSString, 就无法再释放 title 原来的数值。

还有,是 autorelease, 而不是release. 否则, title 还没有来得及被设为新的值, 就被释放既指向垃圾。

例3
{
    /* ... */
   title = [myWindow title];
   [myWindow setTitle:newTitle];
    /*...*/
    // 原来的title 现在已经是垃圾,因为他在 setTitle 方法里已经被释放了。
 }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值