我正在使用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的新手,所以任何事都有帮助。提前谢谢!
答案 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对数据模型也是正确的。