2010-06-29 2 views
0

Как известно, setTitle автоматически сохраняет строку, переданную как параметр. Когда надпись на кнопке должна быть изменена, я думаю, что перед установкой новой строки необходимо отпустить текущую (старую) строку. Интересно, что это самый элегантный способ рассказать об этом.Есть ли автоматический выпуск с setTitle (класс UIButton)?

Смотрите мой пример кода (здесь метод getPlayerHandFromGame производит autoreleased строки, которые сохраняющиеся при 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

ответ

2

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

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

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

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

Угадайте, присоски!

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

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

[currentCardButton titleForState:UIControlStateNormal] 

и применить memory management rules к результату возврата.

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

6

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

2

Посмотрите на съезде собственности объекта:

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

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