在UITableView中访问变量会导致我的应用崩溃

时间:2010-01-18 11:01:07

标签: iphone uitableview

应用程序非常简单,是一个导航到tableview的nevigationviewcontroller。 但是当我访问 langsarray 时,它会崩溃

以下是相关代码:

MenuViewController.m
-(void) Settings{
    TestViewController *testvc = [[TestViewController alloc] initWithNibName:nil bundle:nil];
    [self.navigationController setNavigationBarHidden:NO animated:NO];
    [self.navigationController pushViewController:testvc animated:YES];
    [testvc release];   
}

#import <UIKit/UIKit.h> 
@interface TestViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>         
{ 
    NSArray *langsarray;
} 
@property (nonatomic, retain) NSArray *langsarray;
@end 



#import "TestViewController.h"

@implementation TestViewController
@synthesize langsarray;


- (void)loadView {
    //Create the table
    UITableView *tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStylePlain];  
    tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;  
    tableView.delegate = self;  
    tableView.dataSource = self;    
    [tableView reloadData];     
    self.view = tableView;  

    //read the info
    NSString *path = [[NSBundle mainBundle] pathForResource:@"l" ofType:@"txt"];
    NSString *langs = [[NSString alloc]initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    langsarray = [langs componentsSeparatedByString: @"\n"];

    [path release];
    [langs release];
    [tableView release];

}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {  

    //Accessing langsarray crash the app
    //harcoded works fine: return 5;
    return [langsarray count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: 
                             SimpleTableIdentifier]; 
    if (cell == nil) { 
        cell = [[[UITableViewCell alloc] 
                 initWithStyle:UITableViewCellStyleSubtitle 
                 reuseIdentifier:SimpleTableIdentifier] autorelease]; 
    } 

    NSUInteger row = [indexPath row]; 
    // again, accessing langsarray crash the app
    cell.textLabel.text = [[[langsarray objectAtIndex:row] componentsSeparatedByString:@"="] objectAtIndex:0];
    cell.detailTextLabel.text = [[[langsarray objectAtIndex:row] componentsSeparatedByString:@"="] objectAtIndex:1];

    return cell;
} 

这是输出

  

收到信号:   “EXC_BAD_ACCESS”。警告:不能   找到“_sigtramp”的最小符号 -   回溯可能是不可靠的杀人

Xcode 3.1.4 豹

3 个答案:

答案 0 :(得分:0)

您需要retain此行中的langsarray

langsarray = [langs componentsSeparatedByString: @"\n"];

componentsSeparatedByString会返回您不拥有的NSArray(不是alloc,或使用copy...new...alloc...的方法),所以你需要保留/释放它。

答案 1 :(得分:0)

你的问题就在这一行:

langsarray = [langs componentsSeparatedByString: @"\n"];

右侧返回的值是自动释放的,这意味着稍后读取它时已经取消分配。

请尝试以下更改:

self.langsarray = [langs componentsSeparatedByString: @"\n"];

这将使它使用该属性,该属性将自动保留给您。您也可以考虑手动保留它。

更新以回复评论...

  1. 在将langs拆分为组件之前,langsarray包含了什么?你确定那里有一个真正的字符串吗? numberOfRowsInSection是否包含分配后您所期望的内容?

  2. NSUInteger c = [self.langsarray count]; return c; 实际崩溃了什么?您返回的值是否导致崩溃,或者您是否计算了损坏的对象? (例如,为表中的部分数返回零 - 并且可能仍然会导致崩溃。)

  3. 我将代码拆分为:

    c

    通过这种方式,您可以设置断点并查看{{1}}的值。

答案 2 :(得分:0)

问题:

编辑,经过一些调试

我发现错了:

  • self.langsarray = [langs componentsSeparatedByString:@“\ n”];

  • // [路径发布]; // [langs release];

    但我怀疑是否有内存泄漏。

现在一切正常,

感谢Stephen