是否有自动发布的setTitle(UIButton类)?

时间:2010-06-29 18:28:11

标签: iphone objective-c uibutton retain

众所周知,setTitle会自动保留作为参数传递的字符串。当需要更改按钮标题时,我想在设置新字符串之前必须释放当前(旧)字符串。我想知道最优雅的方式是什么。

请参阅我的代码示例(此处,getPlayerHandFromGame方法生成在调用setTitle时保留的自动释放字符串):

colourString = [pGame getPlayerHandFromGame:1 withColour:COLOUR_HEARTS];


// Split colourString into array of strings if not null.
    if ([colourString length] != 0) {
        listCards = [colourString componentsSeparatedByString:@" "];
        for (cardCounterSameColour = 1; cardCounterSameColour <= [listCards count]; cardCounterSameColour ++) {
            currentCardButton = [self buttonCardNumber:cardCounter];
            // Objects are numbered from 0 in the array
            [currentCardButton setTitle:[listCards objectAtIndex:cardCounterSameColour-1] forState:UIControlStateNormal];
            cardCounter ++;
        }
    }

由于按钮标题将多次更新,因此将多次调用此部分代码。我想在设置标题之前,我应该这样做:

[currentCardButton titleForState:UIControlStateNormal release]

为了释放不再使用的字符串(titleForState返回指向NSString的指针)。

这是避免设备内存加载未使用字符串的正确方法吗?

非常感谢, Apple92

3 个答案:

答案 0 :(得分:6)

任何保留其某个属性上的值集的类也负责在该属性的值再次更改时释放旧值。别担心。

答案 1 :(得分:2)

查看对象所有权约定:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-BEHDEDDB

每个班级都应遵循这些规则(Apple会这样做),所以为了他们你不必担心,因为你没有在你的班级中完成分配/保留,按钮会保留它以供内部使用。

答案 2 :(得分:2)

  

众所周知,setTitle会自动保留作为参数传递的字符串。

真的?我不知道。事实上,我会打赌一品脱啤酒,它不会保留字符串,但复制它。

当然,对于NSString,-copy可能实现为保留和返回self,但如果你传递NSMutableString,则会发生正版拷贝。

  

我想在设置新字符串之前释放当前(旧)字符串是必要的。

再次猜猜,傻逼!

或者不那么讽刺:任何对象都负责管理它想要保持的其他对象的所有权。一旦你在setTitle中传递了标题:你不需要担心一旦它获得一个新的对象如何处理它。

考虑代码:

[currentCardButton titleForState:UIControlStateNormal]

并将memory management rules应用于返回结果。

您是否使用alloc,new或copy获得了它?不,你保留了吗?不(记住我们正在谈论方法传回的对象,不是你最初给它的对象)。因此,您不得发布它。