作者charz (char)
看板MacDev
标题Re: [问题] Xcode程式 Memory Manage的问题
时间Mon Apr 11 18:09:05 2011
※ 引述《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
1F:→ jangin:谢谢您的解答,正在改成用 stringWithFormat的方式中。 04/12 12:53