0

ここで「data」という名前のNSMutableArrayにNSArrayを入力しようとしています。取得しようとすると、EXC_BAD_ACCESSが取得されます。これが私のコードです

.h

@property (nonatomic, retain) NSMutableArray* data;

.m

@synthesize data;

viewDidLoadで

self.data = [NSMutableArray array];
NSArray* ar1 = [[NSArray arrayWithObjects: @"text1", @"text2", @"text3", @"text4", nil] autorelease];
[self.data addObject:ar1];

今、他の方法で、私は内側のNSArrayを取り戻そうとしています:

NSArray* sItem = [NSArray array]; 
sItem = (NSArray*)[self.data objectAtIndex:0];

if (sItem)
{
    if([sItem isKindOfClass:[NSArray class]])/////ERROR LINE
    {
        NSLog(@"Its an Array.");
    }
}
4

1 に答える 1

3

-viewDidLoad、あなたは過剰にリリースしていar1ます。すでに自動リリースされて返されます。/arrayWithObjects:ではなく、を介して配列を取得したため、これを知っています。allocinit

パターンは次のとおりです。

NSArray * temporaryArray = [ [ [ NSArray alloc ] initWithObjects:obj_0, ..., obj_n, nil ] autorelease ]

また

NSArray * temporaryArray = [ NSArray arrayWithObjects:obj0, ..., obj_n, nil ] ;

プロジェクトをARCに切り替える必要があります-これはあなたに代わって処理されます。

編集:

書き直すこともできます

NSArray* sItem = [NSArray array]; 
sItem = (NSArray*)[self.data objectAtIndex:0];
if (sItem) {
    if([sItem isKindOfClass:[NSArray class]]){ /////ERROR LINE
         NSLog(@"Its an Array.");
    }

なので

NSArray* sItem = nil ;
sItem = [self.data objectAtIndex:0];
if( [ sItem isKindOfClass:[ NSArray class ] ] )
{
    NSLog(@"Its an Array.");
}

あるいは

NSArray* sItem = [self.data objectAtIndex:0];
if( [ sItem isKindOfClass:[ NSArray class ] ] )
{
    NSLog(@"Its an Array.");
}

コードに関する注意:

  1. 新しいものNSArrayを割り当て、それをポインタに割り当てていますsItem。に別の値を割り当てると、この配列はすぐに破棄されますsItem。代わりにに初期化sItemしてください。nil
  2. チェックする必要はありませんif (sItem)...に送信-isKindOfClass:(または実際にはメッセージ)すると、常に//nilが返されます。NOnil0

最後に、次のような操作を行って、配列の存在を確認することがよくあります。

if ( sItem.length > 0 ) { /* yes, valid, non-empty array */ }

このショートカットは、文字列に特に適しています。

于 2012-08-18T09:03:10.260 に答える