2

假设我有一个带有字符串的数组。

NSArray *names = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];

我想要的是启动一些自定义类的对象并将它们添加到可变数组中。我正在使用一个带有字符串参数的自定义初始化方法。

更具体地说,我想[SomeClass alloc] initWithName: aName]将结果对象添加到NSMutableArray.

我正在考虑使用 Objective-C 快速枚举。所以我得到的是:

NSMutableArray *objects = [NSMutableArray arrayWithCapacity: [names count];

for (NSString *name in names) {
    [objects addObject: [[[SomeClass alloc] initWithName: name] autorelease]];
}

问题是我无法添加nil到数组中,而且我不喜欢异常处理。但是,我的启动方法可能会返回nil。所以我决定在添加(预防)之前先检查一下。我的新 for-in-loop 是:

SomeClass *someObject;

for (NSString *name in names) {
    someObject = [[[SomeClass alloc] initWithName: name] autorelease];
    if (someObject) {
        [objects addObject: someObject];
    }
}

现在,我不是立即将新对象传递给数组,而是先设置一个指针someObject,然后将指针传递给数组。

这个例子向我提出了一个问题。当我someObject = [[[SomeClass alloc] initWithName: name] autorelease]在循环中时,数组中的现有对象(使用相同的指针添加)是否也会改变?

换句话说:该addObject: (id)someObject方法是为我传递的指针创建一个新的内部副本,还是我必须创建一个指针的副本——我不知道如何——然后自己传递这个副本?

非常感谢!:-)

4

4 回答 4

3

可以重复使用someObject;如果您考虑一下,您已经在name每次循环时都在重用。

-addObject:可能会或可能不会复制您传入的对象。(它不会 - 它保留对象而不是复制它,但可以想象一些 NSMutableArray 子类可以复制。)重要的是这段代码真的不应该不在乎做什么-addObject:

另外,不要忽视指针和它所指向的对象之间的区别。指针只是引用,每次将指针传递给方法或函数时都会复制一个指针。(和 C 一样,Objective-C 按值传递参数,因此将指针传递给方法会导致将指针的值放入堆栈。)但是,对象本身不会被复制。

于 2011-05-12T14:41:53.203 回答
2

简短的回答:不,您不必担心重复使用someObject.

稍微长一点的答案:赋值——<code>someObject = ... 给someObject变量赋值一个新的指针值;addObject:然后获取该值,而不是其someObject自身的地址。

于 2011-05-12T14:36:24.203 回答
2

我认为您在这里对指针的概念感到困惑。当你说someObject = [[[SomeClass alloc] init...你基本上是someObject指向一个新对象的指针。因此,回答您的问题-您当前的代码很好。

至于数组是否维护添加到其中的对象的副本 - 否,数组保留您添加到其中的对象。但是,这与您上面的代码无关。

于 2011-05-12T14:39:01.837 回答
0

Three20给出了答案!

于 2011-06-21T12:41:23.343 回答