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,这是可以理解的,但请记住,其他人将来会阅读此问题和答案。我鼓励任何人始终保留内存管理。也就是说,我上面的答案是完全错误的——我在上面的代码中错过了您的自动释放,因此我添加的版本将导致崩溃。哎呀!我将编辑我的答案以更正这一点。