谁能解释这个保留计数代码中发生了什么?
|
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);
没有找到相关结果
已邀请:
2 个回复
吞睫素
您已经创建了一个可变字符串。您拥有它并负责
您将一些数据追加到字符串。所有权没有变化。
您创建字符串的副本。您拥有副本,并负责
您将指向字符串副本的指针存储在ѭ9中。您没有
的所有权(因此不必拥有
的所有权),并且由于您使用的是
变体,因此
对象的所有权不变。
您创建一个可变数组。您不拥有它。
您将一个对象添加到数组。数组现在也拥有对象
您将一个对象添加到数组。数组现在拥有该对象(您仍然不拥有它) 因此,在此代码结尾,您拥有:
这意味着为了使您的代码正确,还应该具有:
编辑: 您如何知道何时“拥有”对象,什么时候不拥有?很简单: 如果您通过以“ \
\”开头的方法检索对象,或者... 如果您通过以\“
\”开头的方法检索对象,或者... 如果通过包含单词“ \22ѭ\”的方法检索对象,或者... 如果您明确\“
\”对象 只需记住:New-Alloc-Retain-Copy(\“ NARC \”)。如果满足这四个条件之一(并且文档/方法声明没有其他说明),则您“拥有”该对象,并且必须通过对该对象调用“ 11”或“ 25”来放弃该所有权。 这在《内存管理编程指南》中非常清楚地列出。
闪脖