Objective-C:何时释放已分配的对象

时间:2010-05-04 14:45:31

标签: objective-c memory-management

如果我有一个实例方法,并且在这个方法中,我会这样做:

NSString *peopleString = [peopleList componentsJoinedByString: @", "];
...
UILabel *likeLabel = [[UILabel alloc] initWithFrame:CGRectMake(16.0+6.0f, 4.0f, 252.0f, 12.0f)];
[likeLabel setText:peopleString];
[likeLabel setFont:[UIFont fontWithName:@"Arial" size:12]];
[likeRow addSubview:likeLabel];
[likeLabel release];

componentsJoinedByString不包含newcopyalloc,因此我无需发布它。我想知道的是,当我的peopleString被取消分配时。可能它发生在早期?意思是,在我可以在标签中设置文本之前。我应该更好地使用[[NSString alloc] initWithString:[peopleList componentsJoinedByString: @", "]];并在此方法结束时将其释放吗?

2 个答案:

答案 0 :(得分:1)

自动发布的对象(如代码中的“ peopleString ”)由“ drain <”自动释放池( NSAutoreleasePool )释放/ em>“方法被称为。
AppKit在事件循环的每个循环中创建一个自动释放池,并在结束时将其排出 因此,当您执行代码时(例如,在方法中),对象将不会被释放。

答案 1 :(得分:1)

创建peopleString时,引用计数为1.稍后,当您指示likeLabel使用peopleString作为其文本时,引用计数peopleString会增加现在,peopleString的引用计数为2.当likeLabel被释放时,可能在事件循环结束时,引用计数peopleString减1。但是peopleString的实例也在事件循环结束时将其引用计数减1。所以peopleString现在的引用计数为0,并从内存中删除。

有关更好的解释,请参阅#6578