应用程序非常简单,是一个导航到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 豹
答案 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"];
这将使它使用该属性,该属性将自动保留给您。您也可以考虑手动保留它。
更新以回复评论...
在将langs
拆分为组件之前,langsarray
包含了什么?你确定那里有一个真正的字符串吗? numberOfRowsInSection
是否包含分配后您所期望的内容?
NSUInteger c = [self.langsarray count];
return c;
实际崩溃了什么?您返回的值是否导致崩溃,或者您是否计算了损坏的对象? (例如,为表中的部分数返回零 - 并且可能仍然会导致崩溃。)
我将代码拆分为:
c
通过这种方式,您可以设置断点并查看{{1}}的值。
答案 2 :(得分:0)
问题:
编辑,经过一些调试
我发现错了:
self.langsarray = [langs componentsSeparatedByString:@“\ n”];
// [路径发布]; // [langs release];
但我怀疑是否有内存泄漏。
现在一切正常,
感谢Stephen