2013-07-08 3 views
1

я вывешу недостаток 3 варианты метода образца, который использует autorelease известного метод stringByAppendingString (не Дуга образец проект в Xcode 4.6.2.IOS проекта)stringByAppendingString и сохранить дилемма

образец Блок 1:. Ничего не возвращает. просто странные точки к nothing.but не null.
Пример блока 2: ничего не возвращает !.
Пример блока 3: возвращает A1A2A3. как и ожидалось, но я думаю, что у него есть утечка.

Мои вопросы:
a) образец метода 1 работает как ожидалось в проекте MAC. Но не в проекте IOS.
б) блок образца 3 - включает утечку?
c) посмотреть комментарии в примере блока 2. word_ становится A1, A1A2 и ничего.
d) что бы вы поделили свой собственный метод одним и тем же способом? Я ищу безопасный стандартный метод.

спасибо.


ОБРАЗЕЦ БЛОК 1

-(NSString*)sampleMethod 
{ 
    NSString *[email protected]""; 
    NSString *[email protected]"A1"; 
    NSString *[email protected]"A2"; 
    NSString *[email protected]"A3"; 

    word_=[word_ stringByAppendingString:a1];// word_ is A1 
    word_=[word_ stringByAppendingString:a2];// word is nothing but another pointer 
    word_=[word_ stringByAppendingString:a3];// word is nothing too but pointer changed. 
    return word_; 
} 

ОБРАЗЕЦ БЛОК 2

-(NSString*)sampleMethod 
{ 
    NSString *[email protected]""; 
    NSString *[email protected]"A1"; 
    NSString *[email protected]"A2"; 
    NSString *[email protected]"A3"; 

    word_=[word_ stringByAppendingString:a1];// word_ is A1 
    word_=[[word_ stringByAppendingString:a2]retain];// word is A1A2 
    word_=[[word_ stringByAppendingString:a3]retain];// word is nothing ! 
    return word_; 
} 

ОБРАЗЕЦ БЛОК 3

-(NSString*)sampleMethod 
{ 
    NSString *[email protected]""; 
    NSString *[email protected]"A1"; 
    NSString *[email protected]"A2"; 
    NSString *[email protected]"A3"; 

    word_=[[word_ stringByAppendingString:a1]retain];// word_ is A1 
    word_=[[word_ stringByAppendingString:a2]retain];// word_ is A1A2 
    word_=[[word_ stringByAppendingString:a3]retain];// word_ is A1A2A3 
    return word_;//returns as expected but I think leaks method in this method. 
} 


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

но как-то он решен после чистого проекта. Надеюсь, это может сэкономить часы для кого-то. Или не знаете, что что-то пошло не так в адресах чипов памяти.

+1

если ваш код не выполняет то, что он должен сделать, поставить в точку останова и проверить его, если вы видите, что он не выполняет то, что говорит код, пора очищать. –

+2

FYI, идиоматический способ написать это 'NSString * word_ = [NSString stringWithFormat: @"% @% @% @ ", a1, a2, a3]'. – Chuck

+0

Я думаю, что это был просто пример, чтобы понять, как работает управление памятью. В противном случае он мог бы вернуться @ "A1A2A3". –

ответ

4

Первый - это единственный метод, который правильно управляет памятью. Второй утечки два и третий три экземпляра NSString. Если вы не получите строку «A1A2A3» от первого метода, ошибка находится где-то вне этого метода.

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

+0

Пример блока 1 возвращает A1A2A3 в приложении Mac. но emptystring в IOS. (возвращает странный указатель, который не дает никакой ошибки, но обрабатывает как emptystring) –

+0

ну. Я уверен, это был не кошмар. Я просто собирал значения один за другим и сообщал здесь. после очистки проекта. Первый блок образцов работал должным образом. Я не могу гарантировать причину. –

2

Второй и третий блок содержат утечку. Общее правило заключается в том, что вы сохраняете то, что хотите, и вы отпускаете его, когда вам это больше не нужно. Первый блок отлично подходит: вы возвращаете строку с автореализацией, которая будет сохранена вызывающей стороной, если он захочет ее владеть, или если нет, она будет выпущена в первом пуле автоопределений, который будет очищен.

Во втором блоке вы делаете это:

word_=[[word_ stringByAppendingString:a2]retain];// word is A1A2 
word_=[[word_ stringByAppendingString:a3]retain];// word is nothing ! 

Строка @ «A1A2» имеет сохранить кол 2, она будет иметь сохранить счетчик 1 на стоке бассейна рядом autorelease, но вы потеряли какую-либо ссылку на него, так что это утечка. Что касается сохранения строки @ "A1A2A3", это тоже неверно: вызывающий может решить, хочет ли он ее сохранить или нет.Третий блок неверен по тем же причинам.

+0

Я чувствовал то же самое: блок образца 1 - это то, что нужно. , но образец блока 1, возвращает ничего, что видно в вопросе. –

+0

Что значит, что ничего не возвращает? –

+0

Пример блока 1 возвращает A1A2A3 в приложении Mac. но emptystring в IOS. (возвращает странный указатель, который не дает никакой ошибки, но обрабатывает как emptystring). –

3

a) какой блок образца 3 - включает утечку?

Любое использование -retain в вашем примере является неожиданным и может привести к утечке.

b) посмотреть комментарии в Sample Block.word_ становится A1, A1A2 и ничего.

Двойной чек это, пожалуйста.

c) что бы вы закодировали себя самим тем же методом по-разному? Я ищу безопасный стандартный метод.

Вы можете использовать изменяемую строку, например:

- (NSString*)sampleMethod 
{ 
    NSMutableString * word = NSMutableString.string; 
    NSString *[email protected]"A1"; 
    NSString *[email protected]"A2"; 
    NSString *[email protected]"A3"; 

    [word appendString:a1]; 
    [word appendString:a2]; 
    [word appendString:a3]; 

    return [NSString stringWithString:word]; 
} 

или формат строки:

- (NSString *)sampleMethod 
{ 
    NSString *[email protected]"A1"; 
    NSString *[email protected]"A2"; 
    NSString *[email protected]"A3"; 

    return [NSString stringWithFormat:@"%@%@%@", a1, a2, a3]; 
} 

затем просто смешивать и сочетать на основе ваших фактических входов.

+1

NSMutableString.string логически неверен: нотация точек должна использоваться только для доступа к свойствам. –

+1

@RamyAlZuhouri - это действительно ваше предпочтительное соглашение о кодировании - неточно или нелогично. – justin

+1

@RamyAlZuhouri: документы Apple никогда не говорят этого и фактически предлагают противоположные примеры (например, 'array.count'). Синтаксис Dot - это общий способ вызова аксессоров, независимо от того, являются ли они частью объявленного свойства или нет. Если это аксессор, семантически корректно использовать точечную нотацию. – Chuck

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