Re: [問題] Xcode程式 Memory Manage的問題
※ 引述《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
04/12 12:53, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 3 篇):
MacDev 近期熱門文章
PTT數位生活區 即時熱門文章