作者leondemon (狗狗)
看板MacDev
标题Re: [问题] Xcode程式 Memory Manage的问题
时间Tue Apr 12 01:35:48 2011
※ 引述《jangin (我)》之铭言:
: 各位前辈们,请问一个问题
: 在MyViewController.h档中
: @interface MyViewController:UIViewController {
: IBOutlet UITextField *pageinfo_display;
: }
: @end
你没有设定@property吗?建议把pageinfo_display设为property(retain)
: 在MyViewController.m中
: @interface MyViewController()
: int currentPage;
: int totalPage;
: @end
我很好奇的是 在anonymous category (Class Extension)里面可以宣告变数吗?
: @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.
: 不知道自己有没有会错意,影片是英文的@@
UITextField的text的property设定为retain
因此使用此setter会导致retain count +1
而你alloc该NSString,所以你有「责任」去release它!
: (2) 还是在等於的後面的NSString alloc 加上autoRelease
: [[[NSString alloc] initWithFormat:
: @"%d / %d",currentPage,totalPage]autorelease];
这样写法是OK的 但是等於NSString本身就有提供的convenient class method
+(id) stringWithFormat:
: (3) 1和2 都不对,请各位前辈帮忙解说一下,非常感谢。
memory management的原则很简单...
「谁制造问题,谁就有责任去解决」
所以当你alloc/copy/retain一个物件时,就有「责任」必须在适当的位置去release它
像setter本身有retain物件的话,它就会在下次set别的物件时将旧有的物件release掉
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.80.144.89
※ 编辑: leondemon 来自: 111.80.144.89 (04/12 01:37)
1F:推 jangin:感谢解答,在.m中宣告变数,是从斯坦福第二堂课抄来的 04/12 12:51
2F:→ popcorny:anonymous category里面不能宣告变数 至少我compile不过 04/12 15:49
3F:→ jangin:新手请多多指教,上面的写法,我可以compile and执行 04/12 19:26
4F:推 aecho:那样的设法,八成是global variable吧… 04/12 21:59
5F:→ aecho:category除了anonymous可以设properties之外,其它的不行。 04/12 22:00