2010-06-09 55 views
0

我正在编写一个iPhone应用程序,当用户点击UITableView中的一个元素时,该应用程序试图创建第二个视图。代码看起来像如何调试内存分配问题?

ReplyToViewController *reply = [[ReplyToViewController alloc] initWithNibName:@"ReplyTo" bundle:nil]; 
reply.delegate = self; 
Message *message = [resultData objectAtIndex:indexPath.row]; 
int dbid = [message.bizid intValue]; 
NSLog(@"dbid=%d",dbid); 

reply.currentMessage = message; 
reply.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentModalViewController:reply animated:YES]; 

答复对象得到正确创建和视图是正确的。上面代码段的最后一行调用一些框架代码,最终调用ReplyToViewController的viewDidLoad方法。上面代码中回复对象的地址和viewDidLoad中对象的地址不一样。

任何想法,这个新的对象来自哪里?我该如何调试?我还在ReplyToViewController中添加了init方法,希望它能够被调用,并且我可以找到谁在创建这个新对象。但是这种方法并没有停止。

任何帮助将不胜感激。

- (id) init 
{ 
/* first initialize the base class */ 
    self = [super init]; 
return self; 
} 

// Following gets called from the 1st code segment. 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) 
{ 
     // Custom initialization 
    } 

    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSLog(currentMessage.text]; // THIS returns nil and the program fails later in the code. 
} 

回答

0

我敢肯定,这是不相关的,但我想这一点:

NSLog(currentMessage.text]; 

应该是这样的:

NSLog(currentMessage.text); 

而且,我发现,分析(CMD移+ A)我的代码总是有助于追踪潜在的内存泄漏并防止过度的内存分配。

0

最可能的解释是报告错误。

通常当人们看到一个对象的不同地址时,这是因为他们在他们的日志语句中使用了错误的格式描述符。

一个常见的错误是:

NSLog(@"Object address=%i", myObject); // any numerical formatter %d,%f... 

...产生的随机数。你真的想要:

NSLog(@"Object address=%%qX",&myObject); 

...它转储地址在十六进制。

另一个错误是:

NSLog(@"Object address=%%qX",&[myObject description]); 

...返回描述字符串,它的每一次变化的地址。

还有其他人,但你明白了。

如果您使用的是日志语句,请在调试器中检查地址,而不是确认它是不同的对象。

不相关,但我会摆脱类的初始化方法,因为他们什么都不做,只能叫超级。如果您未自定义,只需让编译器默认为super即可。