一个简单的目标C xcode内存管理问题

时间:2010-08-25 05:11:57

标签: iphone objective-c release

在下面的代码中,tapsLable.text在释放tapsMessage时是否会被释放,或者赋值运算符是否会以某种方式增加保留计数以使tapsLabel.text继续可用?

NSString *tapsMessage = [[NSString alloc] initWithFormat:@"%d taps detected", numTaps];
tapsLabel.text = tapsMessage; // tapsLabel is a UILabel object
[tapsMessage release];

4 个答案:

答案 0 :(得分:2)

这是一个提示

您可以为对象编写retainCounter,然后查看赋值之前和之后的内容。

e.g。 NSLog( @"%d", [tapsMessage retainCount] );

这样你可以通过写出retainCount来回答这些问题,因为它始终取决于属性的声明方式。

答案 1 :(得分:1)

tabsLabel.text是tapsLabel上的一个属性。我认为这是一个字符串属性,在分配时执行[目标副本]。没关系细节,是的,赋值运算符会增加保留计数或复制值,因此您可以释放tapsMessage,它仍可在tapsLabel.text中使用。

Read more about properties here.

编辑:在标题中查找UILabel,是的,它为文本属性执行了复制。

@property(nonatomic,copy)   NSString       *text;            // default is nil

编辑:扩大评论中的重要问题

  

如果你必须查看你指定的每个对象的实现细节,有什么人知道何时发布以及何时不发布?

您只需遵循内存管理规则即可。重新安装环境的要点正是在内存管理方面,对象之间存在一些“松散耦合”。只要您保留并正确发布,只要所有参与方的保留/发布都匹配,其他人是否也保留并发布这些相同的对象并不是您的关注。

答案 2 :(得分:1)

在第一行中,您已分配并初始化了NSString。您根据memory management rules拥有此对象,这意味着您有责任释放它。

在第二行中,您要为tapsMessage字符串分配text属性。此属性(假设tapsLabelUILabel)是使用copy属性声明的。对于不可变字符串(NSStrings),要求复制只是增加保留计数,因为不需要对数据进行实际复制(数据永远不会改变)。由于UILabel已复制了该字符串,因此它也声明了所有权(对象可以拥有多个所有者)。

在第三行中,您放弃了所有权,但字符串仍然有一个所有者(标签),因此该对象未被释放。

答案 3 :(得分:0)

它不会被解除分配。