2012-08-08 76 views
1

我不知道如何聲明一個只存儲指向對象的指針的數組。按我的理解,如果我用的方法如何在目標中聲明指針數組c

[ someArray addObject:someObject ] , 

然後,它將對象的副本添加到陣列和任何更改到對象不會得到反映到原來的對象。

我想要的是創建一個指針數組,它只會指向對象,並且對對象所做的更改將會持續存在。原諒我,如果我缺少一些基本的東西。

+0

然後它會將對象的副本添加到數組,並且對對象的任何更改都不會反映到原始對象。 - 不正確看到你應該接受的答案 – 2012-08-10 18:34:22

回答

6

一個NSArrayNSMutableArray一個指針數組。沒有複製完成。

2

您的基本知識有誤。從技術上講,當你這樣做時,你會創建指向這些對象的指針數組。

http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html閱讀說明。

如果你想獲得複製的對象,你必須明確地這樣說。

看這個問題,例如

Deep copying an 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:

標誌

如果是YES,在陣列中的每個對象接收到一個copyWithZone:消息到 創建對象對象的副本必須符合NSCopying 協議。在託管內存環境中,這不是該對象另外會收到的保留消息。對象副本是 然後添加到返回的數組。

如果不是,則在託管內存環境中,陣列中的每個對象在添加到返回的 數組時都會收到保留消息。

默認情況下,將對象添加到nsmutablearray會增加其容量(如果需要),爲對象添加保留和指向對象的指針。

2

...如果我使用的方法

[ someArray addObject:someObject ] , 

然後將對象的副本添加到陣列和 對象的任何變化不會得到反映到原來的對象。

雖然它在技術上不涉及這個問題,但我只是必須糾正你的術語。 Objective-C中的「複製」意味着將方法-copy發送給該對象,該對象本身會創建一個新對象。數組所做的是將-retain發送到它們的對象,這意味着該數組本身現在擁有該對象中的一個樁,這就是爲什麼不引用數組(-objectAtIndex:)或對該對象本身有有效聲明的更改不是反映。

我想要的是,創建一個指針數組,將指向 對象和對對象的更改將持續存在。原諒我,如果我 缺少一些基本的東西。

嗯,不幸的是,iOS不支持類NSPointerArray,這將使您的生活顯着簡單,就實際指針數組而言。沒有進入任何C-craziness,我只能重申我上面提到的:如果你需要改變一個數組中的對象,只需使用有效的引用訪問它,或使用-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!" 
) 

簡單!

+0

爲什麼NSPointerArray對OP的要求有用? – 2012-08-08 03:42:50

+0

**關於實際的指針數組** – CodaFi 2012-08-08 03:43:29

+2

該數組是指針的實際數組。與你提到的類的區別是NSPointerArray是一個在NSArray之後建模的可變集合,但它也可以包含NULL值,可以插入或提取NULL值(以及對象計數)。 https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSPointerArray_Class/Introduction/Introduction.html – Pochi 2012-08-08 03:46:17