首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在指针被添加到可变数组后,我可以重用它吗?

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

Stack Overflow用户
提问于 2011-05-12 22:32:59
回答 4查看 878关注 0票数 2

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

代码语言:javascript
复制
NSArray *names = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];

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

更具体地说,我希望[SomeClass alloc] initWithName: aName]并将结果对象添加到NSMutableArray中。

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

代码语言:javascript
复制
NSMutableArray *objects = [NSMutableArray arrayWithCapacity: [names count];

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

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

代码语言:javascript
复制
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方法是创建我传递的指针的一个新的内部副本,还是我必须创建一个指针的副本-我不知道如何-并自己传递该副本?

非常感谢!:-)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-21 20:41:23

Three20提供了答案!

票数 0
EN

Stack Overflow用户

发布于 2011-05-12 22:41:53

重用someObject是很好的;如果您仔细考虑一下,您就会在每次循环时重用name

-addObject:可能会也可能不会复制您传入的对象。(它不会--它保留对象而不是复制它,但是可以想象某个NSMutableArray子类可以复制它。)重要的是,这段代码实际上不应该关心-addObject:做了什么。

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

票数 3
EN

Stack Overflow用户

发布于 2011-05-12 22:36:24

简短的回答是:不,您不必担心重用someObject

稍长一点的答案:assignment-someObject = ...将一个新的指针值赋给someObject变量;然后addObject:将获取该值,而不是someObject本身的地址。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5979615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档