2011-12-27 72 views
-3

我的UITextField的用戶名和密碼,一旦用戶點擊提交按鈕,我做NSString的內存錯誤/崩潰

NSString* user_name; 
NSString* pass_word; 
UITextField * username; 
UITextField * password; 
NSString * url; 

user_name=username.text; 
pass_word=password.text; 


    url = [[NSString stringWithFormat:@"devices.json?user=%@&pswd=%@", user_name,pass_word]; 

然而,當我嘗試,有時我EXEC_BAD_ACCESS問題與網址,我用了殭屍工具並釘上它%@是導致與url字符串問題的一個。 %@期待user_name,pass_word的NSString,但在過程中,某種程度上,user_name和pass_word發生了變異,並且獲得了一些垃圾值,而不是NSString了。

我嘗試使用[USER_NAME保留]; [pass_word retain]; [url保留];但沒有幫助。它保持與URL的%@參數有EXEC_BAD_ACCESS問題。

其次我能夠輸出的USER_NAME,pass_word,有時有一些值是沒有道理的。我不知道他們在哪裏得到這些價值。我沒有把這些值。我正在進行一個http調用。不知何故,http返回值隱藏在pass_word內,而user_name,我不知道爲什麼它會這樣做。

+0

這是所有的代碼完全相同的方式它的真正使用呢? – 2011-12-27 20:03:50

+0

您可以發佈按下提交按鈕時調用的整個方法嗎? Cherry挑選的代碼並不是那麼有用。 – 2011-12-27 20:04:37

+0

嘗試創建屬性到文本字段,然後合成它並查看結果。我認爲這應該工作。 – Sandeep 2011-12-27 20:07:38

回答

1

從評論:

我宣佈的NSString * USER_NAME,* pass_word common.h中的文件,其中許多文件 需要訪問一個。

除非你有一個單例類,否則每次你分配/初始化一個新的Common對象時,它都會有垃圾值。 Objective-C最佳實踐建議不要這種設計。對於大多數數據來說,存儲在plist或NSUserDefaults中是可以的,但對於用戶名和密碼字符串,您應該將其存儲在鑰匙串中。更好的是,如果服務器接受它,你應該將密碼存儲爲散列。

然後使用上的NSString(稱之爲類似的NSString +認證),有方法從鑰匙鏈拉出數據,以及將其插入鑰匙串類別。

0

嘗試使用分配以及並看看是否有幫助:

url = [[NSString alloc] initWithFormat:@"devices.json?user=%@&pswd=%@", user_name,pass_word]; 
+0

這將如何幫助? '+ stringWithFormat:'只是一個調用'-initWithFormat:'的簡便方法。 – 2011-12-27 20:29:17

+0

不同之處在於stringWithFormat返回一個autorelease字符串,這個會創建一個內存泄漏..我認爲這不會有幫助。 – Bastian 2011-12-27 20:38:28

+0

是的,這個改變不能解決OP的問題。 – 2011-12-27 20:41:38

2

其次我能夠輸出的USER_NAME,pass_word,有時有一些值是沒有道理的。

這通常意味着您分配未初始化的變量......並且它解釋瞭如果您嘗試nslog值的情況下崩潰。但是不可能從您的答案中包含的部分代碼中找出問題所在。

嘗試登錄用戶名和密碼的內容。 (uitextfields)..你應該使用更好的變量名稱。

+0

NSLog包含%@期望NSString,如果它突變併成爲其他的NSString,那麼NSLog也會崩潰。 – lilzz 2011-12-27 21:47:56