Изменить NSString, чтобы ничего не вернуть - PullRequest
2 голосов
/ 21 января 2010

На двух этапах выполнения моего приложения я отправляю строку NSString следующим способом.

Я не получаю предупреждений или ошибок в редакторе кода или отладчике, но когда я NSLog вывод (secondString), мне только дают адрес памяти объекта.

Есть что-то, чем я здесь не занимаюсь?

- (NSString*)validateString
{
NSString *firstString = [NSString stringWithFormat:@"%@", self];
[firstString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSMutableString *secondString = [firstString mutableCopy];
[secondString replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:NSMakeRange([secondString length], 0)];

secondString = [NSString stringWithFormat:@"%@", secondString];
NSLog (@"%@ and %@", firstString, secondString);

return secondString;

[firstString release];
[secondString release];
}

Буду признателен за любую помощь.

Спасибо, Рикки.

Ответы [ 3 ]

4 голосов
/ 21 января 2010

Тьфу, что код неправильный на многих уровнях.

Вот более простая версия:

- (NSString*)validateString {
  NSString *firstString = [self stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  NSString *secondString = [firstString stringByReplacingOccurrencesOfString:@"&" withString:@"%%26" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [firstString length])];

  NSLog (@"%@ and %@", firstString, secondString);

  return secondString;
}

Конструкция [NSString stringWithFormat:@"%@", aString] - довольно бесполезное утверждение, особенно когда у вас есть copy. У вас также есть утечка памяти и сбой в вашем коде (вы создаете копию строки [+1 retain count], присваиваете автоматически освобожденную строку в той же переменной [+0 retain count, исходная строка потеряна и пропущена], а затем освободить автоматически освобожденную строку [сбой при сливе пула автоматического выпуска]).

3 голосов
/ 21 января 2010

Первые комментарии: 1) Все после возврата не будет выполнено, поэтому последние операторы to бесполезны (мертвый код). 2) Если вы не создали с помощью +alloc, вы можете предположить, что экземпляры NSString автоматически освобождены, поэтому вам не нужно отправлять сообщение -release на firstString.

Редактировать : Как отметил Питер Хоси, вы должны освободить строку, полученную -mutableCopy.

Чтобы ответить на ваш вопрос: -stringByAddingPercentEscapesUsingEncoding: возвращает указатель на вновь созданный экземпляр, поэтому вы должны сохранить его.

- (NSString*)validateString
{
NSString *firstString = [NSString stringWithFormat:@"%@", self];
firstString = [firstString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSMutableString *secondString = [firstString mutableCopy];
[secondString replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:NSMakeRange([secondString length], 0)];

 secondString = [NSString stringWithFormat:@"%@", secondString];
 NSLog (@"%@ and %@", firstString, secondString);

 [secondString release];

 return secondString;
 }
2 голосов
/ 21 января 2010
  • Вам нужно использовать %% 26, если вы хотите строку "% 26"
  • Ваш NSMakeRange назад
  • ваше возвращение слишком рано, и вам все равно не нужно освобождать строки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...