我有一点困惑。当我在tableView dataSource方法numberOfRowsInSection中打印我的数组时,我的应用程序崩溃了。
这是我的代码:在.h文件中
@interface AddColor : UIViewController<UITableViewDataSource,UITableViewDelegate>
{
UITableView *tblView;
NSArray *arrayColors;
}
@property(nonatomic,retain)NSArray *arrayColors;
@end
在.m文件中
@synthesize arrayColors;
- (void)viewDidLoad
{
[super viewDidLoad];
[self.navigationController setNavigationBarHidden:NO];
arrayColors = [NSArray arrayWithObjects:@"blackColor", @"darkGrayColor", @"lightGrayColor", @"whiteColor", @"grayColor", @"redColor", @"greenColor", @"blueColor", @"cyanColor", @"yellowColor", @"magentaColor", @"orangeColor", @"purpleColor", @"brownColor", nil];
tblView=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStylePlain];
tblView.delegate=self;
tblView.dataSource=self;
[self.view addSubview:tblView];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
NSLog(@"%d",[arrayColors count]);//App crashes here.
return [arrayColors count];
}
当我打印[arrayColors count];
时,我的应用程序崩溃了我找到崩溃的解决方案,我只是在viewDidLoad中保留数组
[arrayColor retain];
现在工作正常。但是为什么我的应用程序崩溃之前我打印[arrayColor count];
答案 0 :(得分:2)
尝试使用[self.arrayColors count] - 使用ivar getters和setter访问保留的属性
顺便说一句,我强烈建议不要硬编码你的tableview的大小。至少设置自动调整遮罩。
答案 1 :(得分:1)
+ [NSArray arrayWithObjects:]
创建一个自动释放的数组 - 它在释放时不会被激活,但很可能在viewDidLoad
方法返回时释放,因此它是[arrayColor count]
中访问的无效(垃圾)指针。
通过保留数组,您可以摆脱释放错误,但现在您正在泄漏内存。解决这个问题的一般方法是在一个初始化方法中分配和初始化数组,比如
- (id)init
{
if ((self = [super init])) {
arrayColors = [[NSArray alloc] initWithObjects:..., nil];
}
return self;
}
然后在- dealloc
中清除它,以免泄漏内存:
- (void)dealloc
{
[arrayColors release];
[super dealloc];
}
主题的更多信息答案 2 :(得分:0)
您可能已将DataSource和Delegate链接到TableView而不是文件所有者。
答案 3 :(得分:0)
如果你这样做,
[self setArrayColors:[NSArray arrayWithObjects:@"blackColor", @"darkGrayColor", @"lightGrayColor", @"whiteColor", @"grayColor", @"redColor", @"greenColor", @"blueColor", @"cyanColor", @"yellowColor", @"magentaColor", @"orangeColor", @"purpleColor", @"brownColor", nil]];
它应该在不需要另外保留的情况下修复问题,但请确保在dealloc中释放它。
[arrayColors release];