滚动时NSArray线程1错误

时间:2014-02-07 16:48:52

标签: ios iphone objective-c uitableview

我正在使用NSArray来存储我要在UITableViewCell中使用的图片的名称。当我拉桌子视图太多而无法滚动应用程序崩溃并给我:

  

线程1:EXC_BAD_ACCESS(代码= 2,地址= 0xc)。

这就是我用来初始化我的数组:

在我的.h:

@property (retain, nonatomic) NSArray *imagesToDisplay;

在我的.m: (viewDidLoad

_imagesToDisplay = @[@[@"one.png", @"two.png", @"three.png"],
                        @[@"four.png", @"five.png", @"six.png"],
                        @[@"seven.png", @"eight.png", @"nine.png"],
                        @[@"ten.png", @"eleven.png", @"twelve.png"],
                        @[@"thirteen.png", @"fourteen.png", @"fifteen.png"],
                        @[@"sixthteen.png", @"seventeen.png", @"eighteen.png"]
                        ];

这就是我正在检索图像并将图像视图设置为这些图像:

int row = [indexPath row];
cell.image1.image = [UIImage imageNamed:self.imagesToDisplay[row][0]];
cell.image2.image = [UIImage imageNamed:self.imagesToDisplay[row][1]];
cell.image3.image = [UIImage imageNamed:self.imagesToDisplay[row][2]];

即使我注释掉不同的cell.image行,他们仍然会给我一个错误。我的具体错误是

  

线程1:EXC_BAD_ACCESS(代码= 2,地址= 0xc)。

我是目标c的新手,所以任何事都有帮助。提前谢谢!

2 个答案:

答案 0 :(得分:0)

我不确定这仅仅是多维数组中的练习,但我建议不要这样做。

您的第一步应该是为表创建正确的数据模型(类对象)。例如:

@interface ImageRow : NSObject

@property (nonatomic, copy) NSArray *imagePaths;

- (id)initWithArray:(NSArray *)array;

- (NSString)imagePathAtIndex:(NSUInteger)index;

@end

然后你会存储NSArray ImageRows而不是多维数组。从根本上说,你正在完成同样的事情,但它更清晰,更具可扩展性。

您的崩溃EXC_BAD_ACCESS通常是在您尝试访问nil的对象时,当您预期它不会出现时。在大多数情况下,Obj-C会优雅地处理它,但有时候它不能处理它。

答案 1 :(得分:0)

崩溃是因为您没有保留自动释放的对象。当您说某个属性为retain时,只有在您使用其setter时才会为您完成内存管理,通常使用self.property =。而是直接访问支持ivar。因为数组文字是自动释放的并且您无法保留它,所以该数组是自动释放的,_imagesToDisplay指向垃圾。添加保留呼叫或使用其setter来解决此问题。

SiLo对数据模型也是正确的。