Re: [問題] Xcode程式 Memory Manage的問題

看板MacDev作者 (char)時間14年前 (2011/04/11 18:09), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串2/3 (看更多)
※ 引述《jangin (我)》之銘言: : 各位前輩們,請問一個問題 : 在MyViewController.h檔中 : @interface MyViewController:UIViewController { : IBOutlet UITextField *pageinfo_display; : } : @end : 在MyViewController.m中 : @interface MyViewController() : int currentPage; : int totalPage; : @end : @implement MyViewController : -(void) updatePageInfo : { : pageinfo_display.text = [[NSString alloc] initWithFormat: : @"%d / %d",currentPage,totalPage]; : } : @end : 我的問題是 : (1) pageinfo_display.text = ... : (這樣子setter 是不是會自動先做Release 再做新的NSString指定) : 記得在斯坦福的線上影片曾看到 setter 會是 先做Release 再assign. : 不知道自己有沒有會錯意,影片是英文的@@ : (2) 還是在等於的後面的NSString alloc 加上autoRelease : [[[NSString alloc] initWithFormat: : @"%d / %d",currentPage,totalPage]autorelease]; : (3) 1和2 都不對,請各位前輩幫忙解說一下,非常感謝。 應該2才是對的,原本的寫法會有memory leak, 記得所有經過alloc都需要 release, 而你1所提到的setter會做的動作是 retain(告訴系統,這邊會在參考一次, 這邊系統會知道,這個字串 retain 的次數是 2(alloc , assign), 等到pageinfo_display被release後,自動會將text做release的動作, 如你沒有在assign後面加入 autorelease, 這字串retain的次數會為1(autorelease做-1), 造成沒有物件參考到這個字串,但是這個字串又不會被free掉, 因為他的retain次數為1。 所以加入autorelease就會在assign之後,把retain變成1, 代表只有 pageinfo_display 參考到,如 pageinfo_display 被release, 那這個字串也會被release。 另外一個建議: 你可以用這樣的方式來寫,可以避免不必要的memory leak。 pageinfo_display.text = [NSString stringWithFormat: @"%d / %d",currentPage,totalPage]; 這樣的方式,是 NSString 會在 class 物件內, 幫你 alloc memory並自動幫你release。 -- 我不是韓國人,我只是眼睛小 .____. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 112.105.139.30

04/12 12:53, , 1F
謝謝您的解答,正在改成用 stringWithFormat的方式中。
04/12 12:53, 1F
文章代碼(AID): #1DejD5jI (MacDev)
文章代碼(AID): #1DejD5jI (MacDev)