2010-08-25 93 views
0

在下面的代码中,当tapsMessage被释放或赋值运算符以某种方式递增保留计数以使tapsLabel.text继续可用时,将释放tapsLable.text吗?一个简单的目标C xcode内存管理问题

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

回答

0

它不会被释放。

1

tabsLabel.text是tapsLabel上的一个属性。我认为这是一个字符串属性,可以在赋值时完成[target copy]。没关系细节,是的,赋值操作符会增加保留计数或复制值,因此您可以释放tapsMessage,它仍然可用于tapsLabel.text。

Read more about properties here.

编辑:抬头的UILabel在头,是的,它的文本属性的副本。

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

编辑:在评论上的重要问题展开

如何没有人知道什么时候发布,什么时候不,如果你要看看每个实施细节对象,你分配的东西至?

您只需遵循内存管理规则。 refcounted环境的要点正是在内存管理方面,对象之间存在一些“松散耦合”。只要您保留并正确发布,只要所有相关方都保留并发布相匹配的内容,其他人是否也保留并发布了相同的对象并不是您的担心。

+0

我是新来的Objective-C,但我知道C.如果赋值操作符有时会导致保留计数的副本或增量,有时它不会,这会使内存管理非常成问题。如何知道何时发布以及什么时候不发布,以及如何查看每个分配给某个对象的实现细节? (只是好奇) – bhause 2010-08-25 05:23:43

+0

规则其实很简单,一旦你习惯了。看到这里:http://developer.apple.com/mac/library/documentation/cocoa/conceptual/MemoryMgmt/Articles/mmRules.html在你的例子retainCount for tapsMessage实际上不应该增加,因为它是一个副本,而不是保留,操作。正如您在内存管理指南中所看到的,您不必查看实现细节以知道何时(不)发布。 – Jaanus 2010-08-25 05:29:32

+0

感谢大家的帮助和患者。我认为现在很清楚。 – bhause 2010-08-25 21:58:01

2

这里有一个技巧

你可以写为对象的retainCounter那么你看到它是什么之前和分配之后。

例如NSLog(@"%d", [tapsMessage retainCount]);

这样你可以在将来只需写出retainCount来回答这些问题,因为它总是取决于声明的属性。

+3

'retainCount'应该很少被明确地查看。事实上,文档说不要使用'retainCount'方法来检查内存管理问题。请参阅[这里](http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#jumpTo_18)。 – dreamlax 2010-08-25 07:42:06

+0

@dreamlax我知道它不适用于调试,但它确实提供了有关引用计数如何工作的信息,这是OP正面临的问题。 – 2010-08-25 12:02:43

+0

感谢retainCount记录提示。我相信我会在未来使用它。我想我最初的困惑是因为我没有意识到赋值运算符“=”会导致调用存取方法。再次感谢您的帮助! – bhause 2010-08-25 22:09:12

1

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

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

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

+0

“对于不可变字符串(NSStrings),由于不需要进行实际的数据重复(数据永远不会更改),因此询问副本只需增加保留计数。” - 伟大的洞察力。这是正式记录的任何地方,这是如何工作的? – Jaanus 2010-08-25 19:02:03

+0

感谢您的帮助和解释。我认为现在对我来说都很清楚。 – bhause 2010-08-25 22:05:06