内存管理 accessor method 里的 reference count

来源:互联网 发布:基地 知乎 编辑:程序博客网 时间:2024/05/01 23:47
苹果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 objectcopy
需要对象的快照 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 方法里已经被释放了。
 }