将对象添加到容器后将其设置为nil?

时间:2011-02-16 19:09:14

标签: objective-c nsarray nsdictionary nsset

我认为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>
)

3 个答案:

答案 0 :(得分:3)

NSArray添加了一个指向对象的指针。为了跟踪变量的变化,数组必须添加指向变量本身的指针(记住,你只是将变量设置为nil,而不是对象)。可以有许多变量都指向同一个对象,重新分配它们不会改变任何其他变量。

记住:指针不是魔术。它们只是普通变量,其值是内存地址 - 在这种情况下,是对象的内存地址。指向同一对象的两个指针不会与值int的两个5“链接”。更改指针不会影响对象;为了影响对象,你必须向它发送一条消息,使其发生变化(例如[object setValue:6])或取消引用指针直接访问对象的成员(例如{{1 }})。

PS:不要直接访问对象的成员。它很糟糕,很脆弱,很容易出错。我刚才在这里提到它来解释指针是如何工作的。

答案 1 :(得分:2)

设置simple = nil只会使指针指向任何内容。它不会删除数组仍有指针的对象。在NSLog语句中,simple指向的Simple实例的retainCount将是一个。

创建简单的

  • simple =&gt; (简单实例:保留计数1)

添加到数组

  • 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)

发布数组

  • (简单实例:保留计数0,随后销毁)

答案 2 :(得分:0)

NSArray确实只包含指向添加的对象的指针,但没关系 - 它没有指向simple指针本身,而是指向Simple对象{ {1}}指出。因此,在您的示例中,在更改simple指向的内容后,数组仍指向原始simple对象。