1

我想执行一个看起来像这样的 for 循环:

 for (id object in [[MyClass methodReturningSet] allObjects]) {
      //do something
}

该 methodReturningSet 看起来像这样:

- (NSSet *)methodReturningSet {
         MyObject *object1 = [[MyObject alloc] initWithCustomInfo:info1] autorelease];
         MyObject *object2 = [[MyObject alloc] initWithCustomInfo:info2] autorelease];
         MyObject *object3 = [[MyObject alloc] initWithCustomInfo:info3] autorelease];
         MyObject *object4 = [[MyObject alloc] initWithCustomInfo:info4] autorelease];

         return [NSSet setWithObjects: object1, object2, object3, object4, nil];
}

我的问题是,这在内存管理方面是否安全?

我目前的理解是,在运行循环完成后,“对象”将被发送一条释放消息。

我的第一个问题是,整个 for 循环是否在一个运行循环中执行?

我的第二个问题是,是否通过自动释放池向对象发送释放消息是否重要,因为我们循环的数组拥有对其包含的所有对象的强引用?

希望这很清楚。. . 有什么想法吗?

4

2 回答 2

4

我的第一个问题是,整个 for 循环是否在一个运行循环中执行?

是的。

我的第二个问题是,是否通过自动释放池向对象发送释放消息是否重要,因为我们循环的数组拥有对其包含的所有对象的强引用?

NSSet保留您传递给它的对象。将对象添加到其中后,如果不再需要它们,可以释放自己的引用。这可以是在将它们添加到集合后的正常释放调用(见下文),也可以是自动释放调用,就像你做的那样。当您释放 时NSSet,它还将释放(在本例中为释放)它的所有对象。

您可以使用正常的发布消息来喜欢这样:

- (NSSet *)methodReturningSet {
     MyObject *object1 = [[MyObject alloc] initWithCustomInfo:info1];
     MyObject *object2 = [[MyObject alloc] initWithCustomInfo:info2];
     MyObject *object3 = [[MyObject alloc] initWithCustomInfo:info3];
     MyObject *object4 = [[MyObject alloc] initWithCustomInfo:info4];

     NSSet *set = [NSSet setWithObjects: object1, object2, object3, object4, nil];

     [object1 release];
     [object2 release];
     [object3 release];
     [object4 release];

    return set;
}

话虽如此,请考虑使用自动引用计数 (ARC)

于 2012-11-19T21:44:20.823 回答
1

我的第一个问题是,整个 for 循环是否在一个运行循环中执行?

是的。

我的第二个问题是,是否通过自动释放池向对象发送释放消息是否重要,因为我们循环的数组拥有对其包含的所有对象的强引用?

显式使用autorelease或释放​​对象不会有任何区别,因为正如您所说,它们也被NSSet对象保留;for因此它将在循环的整个持续时间内存在,并在释放NSSet通过返回的自动释放时methodReturningSet被释放。

如果您不自动释放它并在循环之外显式释放它,您可能会明显改善一些事情NSSet(但这只会在您离开循环后不立即返回时产生影响)。

于 2012-11-19T21:51:03.167 回答