0

我以为NSArray//NSDictionaryNSSet它们的可变子类只是添加了指向对象的指针,而不是它自己的对象。

因此,如果在将我的“简单”对象添加到容器后将其设置为 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>
)
4

3 回答 3

3

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

记住:指针不是魔术。它们只是普通变量,其值为内存地址——在本例中为对象的内存地址。int指向同一个对象的两个指针与 value 的“链接”不超过两个5。更改指针不会影响对象;为了影响对象,您必须向它发送一条导致其更改的消息(例如[object setValue:6]),或者取消引用指针以直接访问对象的成员(例如object->value = 6)。

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

于 2011-02-16T19:38:46.067 回答
2

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

创建简单

  • 简单 => (简单实例:保留计数 1)

添加到数组

  • 简单 => (简单实例:保留计数 2)

  • [array objectAtIndex:0] => (简单实例:保留计数 2)

发布简单

  • 简单 => (简单实例:保留计数 1)

  • [array objectAtIndex:0] =>(简单实例:保留计数 1)

设置简单 = nil

  • 简单 => 无

  • [array objectAtIndex:0] =>(简单实例:保留计数 1)

释放阵列

  • (简单实例:保留计数 0,随后销毁)
于 2011-02-16T19:28:24.490 回答
0

NSArray确实只包含一个指向添加的对象的指针,但这没关系——它不是指向simple指针本身,而是指向指向的Simple对象simple。因此,在您的示例中,更改指向的对象后simple,数组仍指向原始Simple对象。

于 2011-02-16T19:24:50.027 回答