2011-07-01 29 views
-1

爲什麼這項工作:的Objective-C初始化一個NSArray VS的NSMutableArray

self.array = newArray; 

但這並不:

[[self mutableArray] addObject:object]; 

意義,爲什麼我需要給init NSMutableArray爲它工作當我不必初始化NSArray

編輯:啤酒花這是更清晰的傢伙。

接口:

@interface Foo : UIViewController { 

} 

@property (nonatomic, retain) NSArray *array; 
@property (nonatomic, retain) NSMutableArray *mutableArray; 

@end 

實現:

@implementation Foo 

@synthesize array; 
@synthesize mutableArray; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.array = [Class returningAnArray]; 
    [[self mutableArray] addObject:objectIHaveOmittedTheCode]; 
} 

@end 
+0

您提供的代碼本身並不起作用,而且問題沒有意義,請澄清或者此帖將被關閉。 – Joe

+0

沒有足夠的信息來確定這兩種情況。如何創建'newArray'?什麼是'self',它有一個'mutableArray'方法嗎?如果是這樣,它會返回什麼?如果它是一個財產,它是否已經初始化?最後,你真的想完成什麼? – Caleb

+0

我看到您的編輯,但實現與接口不匹配。請再次編輯。 –

回答

2
self.array = newArray; 

在這一行,你要self.array分配已經創建的對象。所以,你不需要創建它。

[[self mutableArray] addObject:object]; 

但是在這一行中,您嘗試將一個對象添加到實際未創建的數組中。如果你不創建數組,它將是nil,發送消息到nil不會產生任何影響。

2

In Objective-C NSArray對象是不可變的。

self.array = newArray; 

此行是屬性分配。 self.array屬性返回一個指向內存中包含NSArray對象的位置的引用。通過將屬性分配給不同的對象,您並不是真的在自己修改對象。

如果要修改現有NSArray對象,你必須創建一個包含相同的元素NSMutableArray對象:

NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithArray:self.array]; 
[mutableArray addObject:object]; 

注意NSMutableArray繼承NSArray,這樣你就可以安全地分配對象引用通過mutableArray與任何類型的變量NSArray

+2

要清楚的是,它實際上是一個屬性的分配。在自身中可能有也可能沒有名爲'array'的變量。 – Caleb

2

[Class returningArray]爲您做了分配。每個對象在使用之前都需要分配(並且應該被初始化)。解決方案是。

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.array = [Class returningAnArray]; 
    self.mutableArray = [NSMutableArray array]; 
    //Now you can use mutable array 
    [[self mutableArray] addObject:objectIHaveOmittedTheCode]; 
} 

現在你已經創建陣列和你用出去或者是因爲這些類做了它爲你顯式調用頁頭可變數組。