0

众所周知,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

4

3 回答 3

6

任何保留在其属性之一上设置的值的类也有责任在该属性的值再次更改时释放旧值。别担心。

于 2010-06-29T18:37:08.937 回答
2

看一下对象所有权约定:

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

每个班级都应该遵循这些规则(Apple 这样做),因此您不必担心,因为您还没有在班级中进行分配/保留,并且按钮将保留它以供内部使用。

于 2010-06-29T23:46:36.720 回答
2

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

真的吗?我不知道。事实上,我敢打赌它不会保留字符串,而是复制它。

诚然,对于 NSString,-copy 可能实现为保留并返回 self,但如果您将 NSMutableString 传递给它,则会出现真正的副本。

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

再猜一猜,笨蛋!

或者不那么滑稽:任何对象都负责管理它想要保留的其他对象的所有权。一旦你在 setTitle: 中传递了标题,你就不必担心对象在获得新标题后如何处理它。

考虑代码:

[currentCardButton titleForState:UIControlStateNormal]

并将内存管理规则应用于返回结果。

你是用 alloc、new 还是 copy 获得的?不,你保留了吗?不(请记住,我们谈论的是方法传回的对象,而不是您最初给它的对象)。因此,您不能释放它。

于 2010-06-30T08:29:54.897 回答