在下面的代码中,tapsLable.text在释放tapsMessage时是否会被释放,或者赋值运算符是否会以某种方式增加保留计数以使tapsLabel.text继续可用?
NSString *tapsMessage = [[NSString alloc] initWithFormat:@"%d taps detected", numTaps];
tapsLabel.text = tapsMessage; // tapsLabel is a UILabel object
[tapsMessage release];
答案 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
属性。此属性(假设tapsLabel
是UILabel
)是使用copy
属性声明的。对于不可变字符串(NSStrings),要求复制只是增加保留计数,因为不需要对数据进行实际复制(数据永远不会改变)。由于UILabel
已复制了该字符串,因此它也声明了所有权(对象可以拥有多个所有者)。
在第三行中,您放弃了所有权,但字符串仍然有一个所有者(标签),因此该对象未被释放。
答案 3 :(得分:0)
它不会被解除分配。