我认为NSArray
/ NSDictionary
/ NSSet
和他们的可变子类只是添加了指向对象的指针,而不是它自己的对象。
因此,如果在将我的“简单”对象添加到容器后将其设置为nil,为什么在数组(容器)中也没有引用nil?
以下是代码:
NSMutableArray *array = [[NSMutableArray alloc] init];
Simple *simple = [[Simple alloc] init];
[array addObject:simple];
//Array sends retain, lets release
[simple release], simple = nil;
NSLog(@"Simple = \"<Simple: %p>", simple);
NSLog(@"Array: %@", array);
[array release], array = nil;
以下是输出:
2011-02-16 20:00:03.149 Allocations[5433:207] Simple = <Simple: 0x0>
2011-02-16 20:00:03.150 Allocations[5433:207] Array: (
<Simple: 0x4d3d4e0>
)
答案 0 :(得分:3)
NSArray添加了一个指向对象的指针。为了跟踪变量的变化,数组必须添加指向变量本身的指针(记住,你只是将变量设置为nil,而不是对象)。可以有许多变量都指向同一个对象,重新分配它们不会改变任何其他变量。
记住:指针不是魔术。它们只是普通变量,其值是内存地址 - 在这种情况下,是对象的内存地址。指向同一对象的两个指针不会与值int
的两个5
“链接”。更改指针不会影响对象;为了影响对象,你必须向它发送一条消息,使其发生变化(例如[object setValue:6]
)或取消引用指针直接访问对象的成员(例如{{1 }})。
PS:不要直接访问对象的成员。它很糟糕,很脆弱,很容易出错。我刚才在这里提到它来解释指针是如何工作的。
答案 1 :(得分:2)
设置simple = nil只会使指针指向任何内容。它不会删除数组仍有指针的对象。在NSLog语句中,simple指向的Simple实例的retainCount将是一个。
创建简单的
添加到数组
simple =&gt; (简单实例:保留计数2)
[array objectAtIndex:0] =&gt; (简单实例:保留计数2)
发布简单
simple =&gt; (简单实例:保留计数1)
[array objectAtIndex:0] =&gt; (简单实例:保留计数1)
设置simple = nil
simple =&gt;零
[array objectAtIndex:0] =&gt; (简单实例:保留计数1)
发布数组
答案 2 :(得分:0)
NSArray
确实只包含指向添加的对象的指针,但没关系 - 它没有指向simple
指针本身,而是指向Simple
对象{ {1}}指出。因此,在您的示例中,在更改simple
指向的内容后,数组仍指向原始simple
对象。