我刚接触iphone的内存管理,有一个关于标准/正确性的问题。
我的头文件声明:
IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) UITabBarController *tabBarController;在我的init()代码中,我做了类似以下的事情:
self.tabBarController = [[UITabBarController alloc] init];
[tabBarController release];
NSLog(@"Retain count of tbc: %d",[tabBarController retainCount]);以使保留计数回到1。从标准化的角度来看,这是正确的吗?它对我来说只是看起来有点不同,但我还是新手。
谢谢
发布于 2010-06-09 20:38:08
要为该属性赋值,应使用
self.tabBarController = [[[UITabBarController alloc] init] autorelease];或
[tabBarController release];
tabBarController = [[UITabBarController alloc] init];(记得先释放前一个值)
属性setter/getter应该只负责保留/释放实例变量。如果您(或其他人)更改属性设置器以获取输入的副本而不是保留它,会发生什么情况?在这种情况下,您将过度释放实例变量并泄漏原始对象。
您实际上是在发送一条具有私有副作用的消息,然后通过释放下一行上的实例变量来使用这些私有细节。例如,您的代码与以下代码相同:
[self setTabBarControler:[[UITabBarController alloc] init]];
/* Relying on knowledge of the instance variable is bad here, setTabBarController
might do something different in the future */
[tabBarController release];即使您完全控制了类,您仍然应该坚持抽象和封装的基本原则。将实例变量的保留/释放留给底层的属性实现。
发布于 2010-06-09 20:46:29
这很正常。
你要做的是:
self.tabBarController = [[UITabBarController alloc] init];
[tabBarController release];可以由编译器执行,如下所示:
id *tempVar = [[UITabBarController alloc] init];
self.tabBarController = tempVar; //till now, retainCount is 2
[tabBarController release]; //now, retainCount is 1当您分配它时,这个内存块将由一个临时变量保留。因此,更好的方法是:
UITabBarController *tabCtl = [[UITabBarController alloc] init];
self.tabBarController = tabCtl;
[tabCtl release];我不是object-c的专家,只是有点编译方面的知识。所以,如果我错了,这里的专家们请指出。
发布于 2010-06-09 20:34:01
好呀
tabBarController = [[UITabBarController alloc] init];https://stackoverflow.com/questions/3005750
复制相似问题