0

私はiTunesでCP193クラスを見てきましたが、よくあるメッセージは再利用性です。

NSMutableArrayの形式のリストを持つプログラムを作成しています。私はこのクラスに何度もアクセスします。

そこで、配列にNSStringを設定する関数を使用してNSMutableArrayクラスを作成しました

@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;

@終わり

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]);
}
4

3 に答える 3

1

まず第一に、NSMutableArray は抽象クラスであるため、.h および .m で initWithCapacity を宣言および定義していないため、これを定義する必要があります。次に、これが正しい方法であるかどうかわかりません。 ... 既存のクラスに機能を追加する必要があるときはいつでも 、objective-c でいつでもカテゴリを使用できます。サブクラス化は通常、クラスに追加のプロパティをいくつかの機能とともに追加する必要がある場合に行われます。

NSMutableArray のサブクラス化は非常にまれなことであり、それを行う必要性を感じたことがないため、category を調べる必要があると思います。

より明確にするために、この回答を参照できます。

于 2012-12-02T11:21:37.500 に答える
0

不適切な場合は、NSArray をサブクラス化しています。サブクラス化は、特殊化または拡張に使用されます。ここでは NSArray を特殊化または拡張しているのではなく、単に使用しているだけです。したがって、通常どおり NSArray を使用してください。サブクラス化する必要はありません。そのため、NSArray をプロパティとして含むヘルパー データ オブジェクトがあるかもしれません。

また、NSArray のサブクラスには、少なくともクラス名に「Array」が含まれていることを期待しています。

また、Objective C の既存のクラスに機能を追加する場合、サブクラス化ではなくクラス カテゴリが使用される場合があることにも注意してください。カテゴリは、新しい状態 (つまり、ivar/プロパティ) を追加せずに既存のクラスに新しいメソッドを追加する場合に特に役立ちます。

于 2012-12-02T13:16:39.243 に答える
0

NSMutableArray のカスタム初期化子を作成して、アプリケーションでの使用方法により適したものにすればよいようです。

これを行うために NSMutableArray をサブクラス化する必要はありません。

既存のクラスに機能を追加するだけで、余分なストレージを追加したくない場合は、セットアップを実行する NSMutableArray にカテゴリを作成するだけです。

于 2012-12-02T11:31:07.453 に答える