我不知道如何声明一个只存储指向对象的指针的数组。根据我的理解,如果我使用方法
[ someArray addObject:someObject ] ,
然后它将对象的副本添加到数组中,并且对对象的任何更改都不会反映到原始对象。
我想要的是创建一个指针数组,它只指向对象并且对对象所做的更改将持续存在。请原谅我,如果我遗漏了一些基本的东西。
我不知道如何声明一个只存储指向对象的指针的数组。根据我的理解,如果我使用方法
[ someArray addObject:someObject ] ,
然后它将对象的副本添加到数组中,并且对对象的任何更改都不会反映到原始对象。
我想要的是创建一个指针数组,它只指向对象并且对对象所做的更改将持续存在。请原谅我,如果我遗漏了一些基本的东西。
NSArray
或是一个指针数组NSMutableArray
。没有复制。
你的基础错了。从技术上讲,当您这样做时,您会创建指向这些对象的指针数组。
如果要复制对象,则必须明确说明。
例如看这个问题
顺便说一句,您应该使用 NSMutableArray。
还要看看超类 NSArray
专门针对initWithArray:copyItems:
旗帜
如果是,数组中的每个对象都会收到一个 copyWithZone: 消息来创建对象的副本——对象必须符合 NSCopying 协议。在托管内存环境中,这不是对象将收到的保留消息。然后将对象副本添加到返回的数组中。
如果否,则在托管内存环境中,数组中的每个对象在添加到返回的数组时都会收到一条保留消息。
默认情况下,将对象添加到 nsmutablearray 会在必要时增加其容量,为对象添加保留,以及指向对象的指针。
...如果我使用方法
[ someArray addObject:someObject ] ,
然后它将对象的副本添加到数组中,并且对对象的任何更改都不会反映到原始对象。
虽然它在技术上与问题无关,但我必须更正您的术语。Objective-C 中的“复制”意味着将方法-copy
发送到对象,这将在自身中创建一个新对象。数组所做的是发送-retain
到它们的对象,这意味着数组本身现在拥有对象的股份,这就是为什么不引用数组 ( -objectAtIndex:
) 或对对象本身具有有效声明的更改不会被反映的原因。
我想要的是创建一个指针数组,它只指向对象并且对对象所做的更改将持续存在。请原谅我,如果我遗漏了一些基本的东西。
好吧,不幸的是,iOS 不支持类NSPointerArray,这将使您的实际指针数组变得非常容易。在不涉及任何 C 疯狂的情况下,我只能重申我上面提到的内容:如果您需要改变数组中的对象,只需使用对它的有效引用来访问它,或者使用-objectAtIndex
. 只要您仍然对对象有有效的声明(在这种情况下是引用,它的指针没有因为它被发送而改变-retain
),您就可以更改它。请注意下面的简单示例:
NSMutableString *str = [[NSMutableString alloc]initWithString:@"Hello"];
NSArray *arr = [[NSArray alloc]initWithObjects:str, nil];
NSLog(@"%@",arr);
[str appendString:@" Friend!"];
NSLog(@"%@",arr);
这打印:
2012-08-07 21:37:46.368 .MyApp[2325:303] (
Hello
)
2012-08-07 21:37:46.369 .MyApp[2325:303] (
"Hello Friend!"
)
简单的!