在将指针添加到可变数组后,我可以重用它吗?

时间:2011-05-12 14:32:59

标签: objective-c cocoa-touch pointers nsmutablearray fast-enumeration

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

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

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

更具体地说,我想[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 个答案:

答案 0 :(得分:3)

可以重用someObject;如果你仔细想想,每次循环时你都会重复使用name

-addObject:可能会也可能不会复制您传入的对象。(它没有 - 它保留对象而不是复制它,但可以想象一些NSMutableArray子类可以复制它。)重要的事实上,这段代码真的不应该关心-addObject:的作用。

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

答案 1 :(得分:2)

简短回答:不,你不必担心重用someObject

答案稍长:分配 - someObject = ...someObject变量分配新的指针值;然后addObject:获取该值,而不是someObject本身的地址。

答案 2 :(得分:2)

我认为你在指针的概念中感到困惑。当你说someObject = [[[SomeClass alloc] init...时,你基本上将someObject指针指向一个新对象。所以回答你的问题 - 你现在的代码很好。

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

答案 3 :(得分:0)

Three20提供了答案!