数组保留在表视图目标c中

时间:2012-09-08 13:04:01

标签: iphone ios uitableview

我有一点困惑。当我在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];

4 个答案:

答案 0 :(得分:2)

  1. 尝试使用[self.arrayColors count] - 使用ivar getters和setter访问保留的属性

  2. 顺便说一句,我强烈建议不要硬编码你的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];

}

有关Apple Developer.

主题的更多信息

答案 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];