2010-06-09 110 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即可。