假设我有一个带有字符串的数组。
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方法是创建我传递的指针的一个新的内部副本,还是我必须创建一个指针的副本-我不知道如何-并自己传递该副本?
非常感谢!:-)
发布于 2011-06-21 20:41:23
Three20提供了答案!
发布于 2011-05-12 22:41:53
重用someObject是很好的;如果您仔细考虑一下,您就会在每次循环时重用name。
-addObject:可能会也可能不会复制您传入的对象。(它不会--它保留对象而不是复制它,但是可以想象某个NSMutableArray子类可以复制它。)重要的是,这段代码实际上不应该关心-addObject:做了什么。
另外,不要忽视指针和它所指向的对象之间的区别。指针只是引用,每次将指针传递到方法或函数时都会复制它。(与C类似,Objective-C通过值传递参数,因此将指针传递到方法会导致将指针的值放到堆栈上。)但是,对象本身并不会被复制。
发布于 2011-05-12 22:36:24
简短的回答是:不,您不必担心重用someObject。
稍长一点的答案:assignment-someObject = ...将一个新的指针值赋给someObject变量;然后addObject:将获取该值,而不是someObject本身的地址。
https://stackoverflow.com/questions/5979615
复制相似问题