使用NSMutableArray时出错

问题描述 投票:0回答:1

我试图用NSArrays填充一个名为“data”的NSMutableArray。当我尝试检索时,我得到了EXC_BAD_ACCESS。这是我的poulating代码

。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.");
    }
}
objective-c ios5 nsmutablearray multidimensional-array
1个回答
3
投票

-viewDidLoad,你过度释放ar1。它已经自动释放了。你知道这个,因为你通过arrayWithObjects:而不是alloc / init获得了数组。

模式是:

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(或实际上任何消息)将始终返回NO / nil / 0

最后,我经常通过执行以下操作来检查数组是否存在:

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

此快捷方式对字符串特别有用。

© www.soinside.com 2019 - 2024. All rights reserved.