0

我正在尝试使用 NSArrays 填充此处名为“data”的 NSMutableArray。当我尝试检索时,我得到 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:不是通过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)... Sending -isKindOfClass:(或实际上的任何消息)nil将始终返回NO/ nil/ 0

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

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

此快捷方式特别适用于字符串。

于 2012-08-18T09:03:10.260 回答