Objective c 我可以在指针';是否已将添加到可变数组?

Objective c 我可以在指针';是否已将添加到可变数组?,objective-c,cocoa-touch,pointers,nsmutablearray,fast-enumeration,Objective C,Cocoa Touch,Pointers,Nsmutablearray,Fast Enumeration,假设我有一个带字符串的数组 NSArray *names = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil]; 我想要的是初始化一些自定义类的对象,并将它们添加到可变数组中。我正在使用一个接受字符串参数的自定义init方法 更具体地说,我想[SomeClass alloc]initWithName:aName]并将结果对象添加到NSMutableArray 我正在考虑使用Objective-C快速枚举。所以我得到的是: NSM

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

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循环是:

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
方法是否为我传递的指针创建一个新的内部副本,或者我是否必须创建一个指针副本(我不知道如何创建),然后自己传递副本


非常感谢!:-)

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


回答稍微长一点:赋值-
someObject=…
someObject
变量赋值一个新指针值
addObject:
然后获取该值,而不是
someObject
本身的地址。

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


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

重用
someObject
很好;如果您仔细想想,每次经过循环时,您已经在重用
name

-addObject:
可能会也可能不会复制您传入的对象。(它不会——它保留对象而不是复制对象,但可以想象某些NSMutableArray子类可以复制它。)重要的是,此代码实际上不应该关心
-addObject:
的功能


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

提供了答案!

不要担心内存泄漏。我在这里添加发行版并不是为了让示例尽可能简短和切题。谢谢。@King C,这是可以理解的,但请记住,其他人将来会阅读此问题和答案。我鼓励任何人始终保留内存管理。也就是说,我上面的答案是完全错误的——我在上面的代码中错过了您的自动释放,因此我添加的版本将导致崩溃。哎呀!我将编辑我的答案以更正这一点。