假设我有一个带字符串的数组。
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
方法是否为我传递的指针的新内部副本,或者我必须创建指针的副本 - 我不知道如何 - 并通过复制自己?
非常感谢! : - )
答案 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提供了答案!