首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iphone @property(retain)、init()和标准

iphone @property(retain)、init()和标准
EN

Stack Overflow用户
提问于 2010-06-09 20:31:37
回答 4查看 323关注 0票数 1

我刚接触iphone的内存管理,有一个关于标准/正确性的问题。

我的头文件声明:

代码语言:javascript
复制
 IBOutlet UITabBarController *tabBarController;
 @property (nonatomic, retain) UITabBarController *tabBarController;

在我的init()代码中,我做了类似以下的事情:

代码语言:javascript
复制
self.tabBarController = [[UITabBarController alloc] init];
[tabBarController release];
NSLog(@"Retain count of tbc: %d",[tabBarController retainCount]);

以使保留计数回到1。从标准化的角度来看,这是正确的吗?它对我来说只是看起来有点不同,但我还是新手。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-09 20:38:08

要为该属性赋值,应使用

代码语言:javascript
复制
self.tabBarController = [[[UITabBarController alloc] init] autorelease];

代码语言:javascript
复制
[tabBarController release];
tabBarController = [[UITabBarController alloc] init];

(记得先释放前一个值)

属性setter/getter应该只负责保留/释放实例变量。如果您(或其他人)更改属性设置器以获取输入的副本而不是保留它,会发生什么情况?在这种情况下,您将过度释放实例变量并泄漏原始对象。

您实际上是在发送一条具有私有副作用的消息,然后通过释放下一行上的实例变量来使用这些私有细节。例如,您的代码与以下代码相同:

代码语言:javascript
复制
[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];

即使您完全控制了类,您仍然应该坚持抽象和封装的基本原则。将实例变量的保留/释放留给底层的属性实现。

票数 2
EN

Stack Overflow用户

发布于 2010-06-09 20:46:29

这很正常。

你要做的是:

代码语言:javascript
复制
self.tabBarController = [[UITabBarController alloc] init];
[tabBarController release];

可以由编译器执行,如下所示:

代码语言:javascript
复制
id *tempVar = [[UITabBarController alloc] init];
self.tabBarController = tempVar;                  //till now, retainCount is 2
[tabBarController release];                       //now, retainCount is 1

当您分配它时,这个内存块将由一个临时变量保留。因此,更好的方法是:

代码语言:javascript
复制
UITabBarController *tabCtl = [[UITabBarController alloc] init];
self.tabBarController = tabCtl;
[tabCtl release];

我不是object-c的专家,只是有点编译方面的知识。所以,如果我错了,这里的专家们请指出。

票数 3
EN

Stack Overflow用户

发布于 2010-06-09 20:34:01

好呀

代码语言:javascript
复制
tabBarController = [[UITabBarController alloc] init];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3005750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档