2012-12-02 54 views
0

我一直在看itunes上的CP193類,並且出現的常見信息是可重用性。Subclassing NSMutableArray

我正在創建一個具有NSMutableArray形式的列表的程序。我將一遍又一遍地訪問這個類。

所以我創建了一個功能一個NSMutableArray類設置NSString的數組

@interface Geology : NSMutableArray 
- (void) setuparray; 

在實現文件中我有

[super addobjects:@"object1"]; 

我想初始化這個對象與對象已內。我進口的頭文件我的ViewController裏面用下面的代碼:

Geology *geology = [[Geology alloc] initWithCapacity:5]; 
[geology setuparray]; 
NSLog(@"%@", [geology objectAtIndex:1]; 

但是程序沒有與下面的錯誤編譯:

終止應用程序由於未捕獲的異常「NSInvalidArgumentException」,原因是:「* - [NSMutableArray initWithCapacity:]:僅爲抽象類定義的方法。定義 - 地質學initWithCapacity:]!

因此,我需要定義我的新文件中的容量。但是,即使我在文件中添加[Super initWithCapacity],它仍然不起作用?

編輯:

Geology.h

@interface Geology : NSMutableArray 
- (void) setupGeology; 

@end

Geology.m

@implementation Geology 
- (void) setupGeology{ 
    [super initWithCapacity:1]; 
    [super addObject:@"object1"]; 
} 
@end 

在我的ViewController我有

#import "Geology.h" 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    Geology *geology = [[Geology alloc] initWithCapacity:5]; 
    [geology setupGeology]; 
    NSLog(@"%@", [geology objectAtIndex:1]); 
} 
+0

可以顯示地質學的.h和.m嗎? –

+3

NSArray是一個類集羣。所以即使你看到的暴露類是NSArray和NSMutableArray,那些只是接口。你回來的實際對象可能來自無數的課程。這就是爲什麼從類集羣進行子類化通常是個壞主意。但是,如果您必須繼承子類,那麼請閱讀文檔中的子類註釋。基本上,還有一些方法需要從NSMutableArray和NSArray中重寫。 – Anurag

+0

啊謝謝你。我想我會放棄這個想法,只是重用代碼。 – nimbus

回答

1

首先你沒有在你的.h和.m中聲明和定義initWithCapacity,因爲NSMutableArray是一個抽象類,所以你需要定義這個,其次我不確定這是否是正確的方法要做到這一點......無論何時您需要爲現有課程添加額外功能,您都可以在objective-c中使用類別。當你需要向一個類添加額外的屬性以及一些功能時,子類化可以完成。

我相信你應該看看類別,因爲NSMutableArray的子​​類是非常罕見的事情,我從來沒有覺得有必要這樣做。

爲了更加清晰起見,您可以參考answer

+0

NSMutableArray不是一個抽象類。我可以實例化一個很好。另外,Objective C實際上並不包含抽象類。 – occulus

0

看起來你所要做的就是爲NSMutableArray創建一個自定義的初始化程序,以便它更適合你在應用程序中使用它的方式。

你不必爲此做NSMutableArray的子​​類。

如果您只想爲現有類添加功能並且不添加額外存儲空間,那麼您可以在NSMutableArray上創建一個類別來爲您執行設置。

0

當NSArray不合適時,您正在繼承NSArray。子類化用於專門化或擴展。你不是在這裏專門化或擴展NSArray - 你只是在使用它。因此,正常情況下只需使用NSArray;無需子類。所以你可能有一個輔助數據對象,它包含一個NSArray作爲屬性。

另外,我希望NSArray的子​​類在類名中至少有'Array'。

還要注意,當向Objective C中的現有類中添加功能時,有時使用類別類別而不是子類別。當您希望將新方法添加到現有類而不添加任何新狀態(即ivars/properties)時,類別特別有用。