1

我不知道如何声明一个只存储指向对象的指针的数组。根据我的理解,如果我使用方法

    [ someArray addObject:someObject ] ,

然后它将对象的副本添加到数组中,并且对对象的任何更改都不会反映到原始对象。

我想要的是创建一个指针数组,它只指向对象并且对对象所做的更改将持续存在。请原谅我,如果我遗漏了一些基本的东西。

4

3 回答 3

6

NSArray或是一个指针数组NSMutableArray 没有复制。

于 2012-08-08T04:02:11.650 回答
2

你的基础错了。从技术上讲,当您这样做时,您会创建指向这些对象的指针数组。

http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html阅读描述。

如果要复制对象,则必须明确说明。

例如看这个问题

深拷贝一个 NSArray

顺便说一句,您应该使用 NSMutableArray。

还要看看超类 NSArray

http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html#//apple_ref/occ/cl/NSArray

专门针对initWithArray:copyItems:

旗帜

如果是,数组中的每个对象都会收到一个 copyWithZone: 消息来创建对象的副本——对象必须符合 NSCopying 协议。在托管内存环境中,这不是对象将收到的保留消息。然后将对象副本添加到返回的数组中。

如果否,则在托管内存环境中,数组中的每个对象在添加到返回的数组时都会收到一条保留消息。

默认情况下,将对象添加到 nsmutablearray 会在必要时增加其容量,为对象添加保留,以及指向对象的指针。

于 2012-08-08T03:29:41.390 回答
2

...如果我使用方法

[ 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!"
)

简单的!

于 2012-08-08T03:36:00.683 回答