2010-10-19 5 views
0

Ребята: Пожалуйста, помогите. У меня есть класс утилиты, который возвращает NSString с кодировкой. Как это:Должен ли я освободить этот NSString?

/*Get a NSString with chinese encoding*/ 
+(NSString*) getGBKString:(void *)buffer 
{ 
    NSString* string = [[[NSString alloc] 
         initWithBytes:buffer 
         length:sizeof(buffer) 
         encoding:kCFStringEncodingGB_18030_2000] 
         autorelease]; 

    return string; 
} 

Здесь autorelease это правильно делать?

Если это так, вызывающий метод должен вызывать удержание, чтобы освободить объект NSString?

ответ

6

Здесь autorelease - правильная вещь?

Да. Поскольку метод не содержит +alloc/new/copy, чтобы следовать за Cocoa memory management rules, вы должны вернуть объект без права собственности.

Кроме того, вы можете переименовать метод на +newGBKString: и удалить -autorelease, тогда люди, знающие соглашение, узнают, что вызывающий абонент получит право собственности.

Если да, то вызывающий метод должен вызвать удержание, чтобы освободить объект NSString?

Вызывающий абонент должен -retain, если он хочет сохранить NSString.

+0

Поблагодарите Kenny и Jacob сначала. Но я немного смущен. Как вы сказали, -autorelease изменят счетчик удержания на 0, то экземпляр NSString должен быть отменен перед возвратом, правильно? Тогда вызывающий получит нуль? – icespace

+2

Счет сохранения упадет до 0 только после того, как пул авторезистов будет слит. –

+3

@icespace: '-autorelease' в основном« релиз позже ». Когда вы вызываете '-autorelease', право собственности будет передано в пул авто-релизов, который будет« освобождать »его при прогоне цикла. Эффект подобен возврату «умирающего» объекта (но все еще действительного) значения удержания 0. – kennytm

Смежные вопросы