-1

我有一点困惑。当我在 tableView 数据源方法 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

4 回答 4

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

  2. 顺便说一句,我强烈建议不要对 tableview 的大小进行硬编码。至少设置自动调整大小的蒙版。

于 2012-09-08T13:31:39.447 回答
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 的话题。

于 2012-09-08T13:08:52.330 回答
0

您可能已将 DataSource 和 Delegate 链接到您的 TableView 而不是文件所有者。

于 2012-09-08T13:10:55.133 回答
0

如果你这样做,

 [self setArrayColors:[NSArray arrayWithObjects:@"blackColor", @"darkGrayColor", @"lightGrayColor", @"whiteColor",  @"grayColor", @"redColor", @"greenColor", @"blueColor", @"cyanColor", @"yellowColor", @"magentaColor", @"orangeColor", @"purpleColor", @"brownColor", nil]];

它应该可以解决问题而无需再次保留,但请确保在 dealloc 中释放它。

  [arrayColors release];
于 2012-09-08T14:20:35.967 回答