每次我尝试从我的应用程序访问视图时,应用程序都会立即关闭。我捕获了激活 NSZombieEnabled 的日志。这就是我得到的原因:
*** -[RecargaOtroController tableView:cellForRowAtIndexPath:]: message sent to deallocated instance 0x604fd20
(gdb) info malloc-history 0x604fd20
Alloc: Block address: 0x0604fd20 length: 192
Stack - pthread: 0xa07c6540 number of frames: 38
0: 0x955250a3 in malloc_zone_calloc
1: 0x95524ffa in calloc
2: 0x10a62d4 in class_createInstance
3: 0xe725d8 in +[NSObject(NSObject) allocWithZone:]
4: 0xe723da in +[NSObject(NSObject) alloc]
5: 0x519c3b in -[UIClassSwapper initWithCoder:]
6: 0x6039fd in UINibDecoderDecodeObjectForValue
7: 0x6046ac in -[UINibDecoder decodeObjectForKey:]
8: 0x51993e in -[UIRuntimeConnection initWithCoder:]
9: 0x6039fd in UINibDecoderDecodeObjectForValue
10: 0x6032f5 in UINibDecoderDecodeObjectForValue
11: 0x6046ac in -[UINibDecoder decodeObjectForKey:]
12: 0x518c36 in -[UINib instantiateWithOwner:options:]
13: 0x51aab7 in -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:]
14: 0x3d0628 in -[UIViewController _loadViewFromNibNamed:bundle:]
15: 0x3ce134 in -[UIViewController loadView]
16: 0x3ce00e in -[UIViewController view]
17: 0x3cc482 in -[UIViewController contentScrollView]
18: 0x3dcf25 in -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:]
19: 0x3db555 in -[UINavigationController _layoutViewController:]
20: 0x3dc7aa in -[UINavigationController _startTransition:fromViewController:toViewController:]
21: 0x3d732a in -[UINavigationController _startDeferredTransitionIfNeeded]
22: 0x3de562 in -[UINavigationController pushViewController:transition:forceImmediate:]
23: 0x3d71c4 in -[UINavigationController pushViewController:animated:]
24: 0x560e in -[RootViewController tableView:didSelectRowAtIndexPath:] at /Users/ipoletti/Documents/Recargame2/Recargame2/Classes/RootViewController.m:378
25: 0x395b68 in -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:]
26: 0x38bb05 in -[UITableView _userSelectRowAtPendingSelectionIndexPath:]
27: 0x9d79e in __NSFireDelayedPerform
28: 0xf2f8c3 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
29: 0xf30e74 in __CFRunLoopDoTimer
30: 0xe8d2c9 in __CFRunLoopRun
31: 0xe8c840 in CFRunLoopRunSpecific
32: 0xe8c761 in CFRunLoopRunInMode
33: 0x17851c4 in GSEventRunModal
34: 0x1785289 in GSEventRun
35: 0x32cc93 in UIApplicationMain
36: 0x2a3c in main at /Users/.../Documents/Recargame2/Recargame2/main.m:14
37: 0x29cd in start
显然 tableView 是问题,但我无法弄清楚它有什么问题。它应该如何在 Interface Builder 中链接?我的 .h 中有这个:
@interface RecargaOtroController : UIViewController <UINavigationControllerDelegate, UITableViewDataSource, UITableViewDelegate>{
BOOL agrandaRecarga;
}
IBOutlet UITableView *tableView;
@property (nonatomic, retain)IBOutlet UITableView *tableView;
UITextField *myLoc;
@property (nonatomic, retain)UITextField *myLoc;
这是我关于 tableView 的 .m 的一部分(我已经合成了它):
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
NSLog(@"TABLE VIEW: %@",tableView);
NSLog(@"CELL");
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell==nil){
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]autorelease];
}
int r, g, b;
b = 0x005C84 & 0x0000FF;
g = ((0x005C84 & 0x00FF00) >> 8);
r = ((0x005C84 & 0xFF0000) >> 16);
UIColor *movistarColor = [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:100.0f];
cell.detailTextLabel.font = [UIFont fontWithName:@"Verdana" size:15.0];
cell.detailTextLabel.textColor = movistarColor;
cell.textLabel.font = [UIFont fontWithName:@"Verdana-Bold" size:14.0];
cell.textLabel.textColor = movistarColor;
if([ListaNumerosController hayDefault]==nil){
NSLog(@"NO HAY NUMEROS CARGADOS");
if(indexPath.row == 0){
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ (%@)", tarjetaSeleccionada.alias, tarjetaSeleccionada.numero];
}else if(indexPath.row == 1){
cell.detailTextLabel.text = @"Otro";
}else if(indexPath.row == 2){
myLoc = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 250, 40)];
myLoc.adjustsFontSizeToFitWidth = YES;
myLoc.textColor = movistarColor;
myLoc.textAlignment = UITextAlignmentLeft;
myLoc.highlighted = NO;
myLoc.clearsContextBeforeDrawing=YES;
myLoc.placeholder = @"Ingrese su número";
myLoc.delegate = self;
myLoc.font = [UIFont fontWithName:@"Verdana" size:14.0];
myLoc.clearButtonMode = UITextFieldViewModeNever; // no clear 'x' button to the right
if(myLoc.text.length!=10){
[myLoc becomeFirstResponder];
}
[myLoc setKeyboardType: UIKeyboardTypeNumberPad];
[myLoc setEnabled:YES];
[cell addSubview:myLoc];
}else /*if(indexPath.row == 3)*/{
cell.detailTextLabel.text = recarga.monto;
}
}else{
NSLog(@"HAY NUMEROS CARGADOS");
if(![telefonoSeleccionado.alias isEqualToString:@"Otro"]){
NSLog(@"NO SE SELECCIONO OTRO NUMERO");
if(indexPath.row == 0){
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ (%@)", tarjetaSeleccionada.alias, tarjetaSeleccionada.numero];
}else if(indexPath.row == 1){
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ (%@)",telefonoSeleccionado.alias,[telefonoSeleccionado.telefono substringFromIndex:6]];
}else if(indexPath.row == 2){
cell.detailTextLabel.text = recarga.monto;
myLoc.text = @"";
}else if(indexPath.row == 3){
cell.detailTextLabel.text = @"";
}
}else{
NSLog(@"SE SELECCIONO OTRO NUMERO");
if(indexPath.row == 0){
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ (%@)", tarjetaSeleccionada.alias, tarjetaSeleccionada.numero];
}else if(indexPath.row == 1){
cell.detailTextLabel.text = @"Otro";
}else if(indexPath.row == 2){
cell.detailTextLabel.text = @"";
}else if(indexPath.row == 3){
cell.detailTextLabel.text = recarga.monto;
}
}
}
return cell;
}
- (void)dealloc {
[super dealloc];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// Start listening for updates when visable
[tableView setDelegate:self];
[tableView reloadData];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// Stop listening for updates when not visable
[tableView setDelegate:nil];
}
我在想问题可能出在 Interface Builder 文件中,有什么建议可以找出问题所在吗?
谢谢!
更新:我的应用程序包含一个带有表格的主窗口。当您单击每一行时,您将转到另一个视图。新视图 (RecargaOtroController) 有另一个表。我使用另一个控制器以相同的方式实例化每个视图:
第三视图控制器.h
#import <UIKit/UIKit.h>
@interface ThirdViewController : UIViewController {
}
@end
第三视图控制器.m
#import "ThirdViewController.h"
@implementation ThirdViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization.
}
return self;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
[super viewDidUnload];
}
- (void)dealloc {
[super dealloc];
}
然后,我的 RootViewController 是主屏幕:
RootViewController.h(摘录)
#import <UIKit/UIKit.h>
@interface RootViewController : UITableViewController <UIAlertViewDelegate, UINavigationControllerDelegate, UITableViewDataSource, UITableViewDelegate> {
NSMutableArray *opcionesMenu;
BOOL agrandaRecarga;
}
IBOutlet UITableView *tableView;
@property (nonatomic, retain)IBOutlet UITableView *tableView;
RootViewController.m(摘录)
ThirdViewController *detailViewController = nil;
if (indexPath.row == 1) {
[self showConfirmaRecargaMessage];
return;
}else if (indexPath.row == 2) {
detailViewController = [[RecargaOtroController alloc] initWithNibName:@"RecargaOtro" bundle:nil];
detailViewController.title = @"Recargar otro número o monto";
}else if (indexPath.row == 3) {
...
- (void)dealloc {
[super dealloc];
}
我从不解除 RecargaOtroController (无论如何,我正在实例化的任何屏幕类别,那些总是有效的)。