Существует ли автоматический выпуск с помощью setTitle (класс UIButton)? - PullRequest
0 голосов
/ 29 июня 2010

Как всем известно, 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 ]

6 голосов
/ 29 июня 2010

Любой класс, который сохраняет значение, установленное в одном из его свойств, также отвечает за освобождение старого значения, когда значение этого свойства снова изменяется. Не беспокойся об этом.

2 голосов
/ 30 июня 2010

Как всем известно, setTitle автоматически сохраняет строку, переданную в качестве параметра.

В самом деле? Я не знаю это На самом деле, я поставлю пинту пива, что она не сохраняет строку, а копирует ее.

Конечно, для NSString -copy, вероятно, реализован как выполняющий сохранение и возврат себя, но если вы передадите ему NSMutableString, произойдет подлинная копия.

Я думаю, что необходимо освободить текущую (старую) строку перед установкой новой.

Снова угадай, присоска!

Или менее явно: любой объект отвечает за управление правами собственности на другие объекты, которые он хочет сохранить. После того, как вы передали заголовок в setTitle: вам не нужно беспокоиться о том, как объект избавится от него, как только он получит новый.

Рассмотрим код:

[currentCardButton titleForState:UIControlStateNormal]

и применить правила управления памятью к возвращаемому результату.

Вы получили его с помощью alloc, new или copy? Вы сохранили это? Нет (помните, мы говорим об объекте, переданном обратно методом, , а не объект, который вы ему изначально дали). Следовательно, вы не должны выпускать его.

2 голосов
/ 30 июня 2010

Взгляните на соглашение о владении объектами:

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

Каждый класс должен следовать этим правилам (Apple это делает), поэтому вам не нужно беспокоиться, потому чтоВы не сделали выделение / сохранение в своем классе, и кнопка сохранит его для внутреннего использования.

...