我试图用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.");
}
}
在-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.");
}
关于你的代码的注释:
NSArray
并将其分配给指针sItem
。当您为sItem
指定另一个值时,会立即丢弃此数组。只需将sItem
初始化为nil
。if (sItem)
...向-isKindOfClass:
发送nil
(或实际上任何消息)将始终返回NO
/ nil
/ 0
。最后,我经常通过执行以下操作来检查数组是否存在:
if ( sItem.length > 0 ) { /* yes, valid, non-empty array */ }
此快捷方式对字符串特别有用。