谁能解释这个保留计数代码中发生了什么?

|
NSMutableString *ms = [[NSMutableString alloc]init];
[ms appendFormat:@\"element %ld\",1];
[ms appendFormat:@\"element %ld\",2];
NSMutableString *ms2 = [ms mutableCopy];
NSLog(@\"ms retain count:%lu\",ms.retainCount);
NSLog(@\"ms2 retain count:%lu\",ms2.retainCount);
NSValue *sw = [NSValue valueWithNonretainedObject:ms2];
NSMutableArray *a = [NSMutableArray array];
[a addObject:ms];
[a addObject:sw];
NSLog(@\"ms retaincount %lu\",ms.retainCount);
NSLog(@\"ms2 retaincount %lu\",ms2.retainCount);
    
已邀请:
您的问题是您期望ѭ1会有用。 它不是,您应该忘记存在“ 1” 但这是发生了什么:
NSMutableString *ms = [[NSMutableString alloc]init];
您已经创建了一个可变字符串。您拥有它并负责
releasing
[ms appendFormat:@\"element %ld\",1];
[ms appendFormat:@\"element %ld\",2];
您将一些数据追加到字符串。所有权没有变化。
NSMutableString *ms2 = [ms mutableCopy];
您创建字符串的副本。您拥有副本,并负责
releasing
NSValue *sw = [NSValue valueWithNonretainedObject:ms2];
您将指向字符串副本的指针存储在ѭ9中。您没有
NSValue
的所有权(因此不必拥有
release
的所有权),并且由于您使用的是
NonretainedObject:
变体,因此
ms2
对象的所有权不变。
NSMutableArray *a = [NSMutableArray array];
您创建一个可变数组。您不拥有它。
[a addObject:ms];
您将一个对象添加到数组。数组现在也拥有对象
[a addObject:sw];
您将一个对象添加到数组。数组现在拥有该对象(您仍然不拥有它) 因此,在此代码结尾,您拥有:
ms
ms2
这意味着为了使您的代码正确,还应该具有:
[ms release];
[ms2 release];
编辑: 您如何知道何时“拥有”对象,什么时候不拥有?很简单: 如果您通过以“ \
alloc
\”开头的方法检索对象,或者... 如果您通过以\“
new
\”开头的方法检索对象,或者... 如果通过包含单词“ \22ѭ\”的方法检索对象,或者... 如果您明确\“
retain
\”对象 只需记住:New-Alloc-Retain-Copy(\“ NARC \”)。如果满足这四个条件之一(并且文档/方法声明没有其他说明),则您“拥有”该对象,并且必须通过对该对象调用“ 11”或“ 25”来放弃该所有权。 这在《内存管理编程指南》中非常清楚地列出。     
创建了一个您拥有的新可变字符串ms(如果您拥有\“ alloc \”,则拥有它*),因此它以保留计数1(而不是\“ autoreleased \”)开始 对于ms2同样如此(如果您通过\“ copy \”创建它,则您拥有它*) ms2由NSValue的sw包装,但是sw不想保留ms2(valueWithNonRetainedObject),因此不会增加ms2的保留计数 ms和sw被添加到可变数组a。数组始终保留其元素,因此ms和sw的保留计数增加1-但ms2的保留计数未增加,因为它不是数组的元素(而是NSValue sw的元素) *)请参阅内存管理规则     

要回复问题请先登录注册