Проблема в том, что экземпляр строки создается с использованием метода класса, который начинается с имени класса (stringWithFormat
). По соглашению, эти типы методов класса возвращают объект с автоматическим освобождением, освобождая вас от беспокойства об их освобождении, если только вы специально не вызываете retain для возвращаемого объекта.
Если вы хотите выполнить собственное управление памятью на объекте, вы можете изменить свою строку:
NSString *additionalQuery = [NSString stringWithFormat:
@"login_username=%@&login_password=%@", username, password];
к одному из следующих:
NSString *additionalQuery = [[NSString alloc] initWithFormat:
@"login_username=%@&login_password=%@", username, password];
или
NSString *additionalQuery = [[NSString stringWithFormat:
@"login_username=%@&login_password=%@", username, password] retain];
Кроме того, у вас также есть несколько других проблем с этим кодом.
Переменная username
не должна быть освобождена, потому что, опять же, по соглашению, метод, из которого вы получаете ее из GetUsernameFromNSDefaults
, должен возвращать объект с автоматическим освобождением. Как общее практическое правило, любой метод, отличный от init
, должен возвращать объект с автоматическим освобождением. Программисту, не имеющему знаний о базе кода, будет очень трудно подобрать его и изменить без соблюдения этих соглашений.
Переменная request
освобождать не нужно, поскольку она создается с помощью метода класса, который возвращает объект с автоматическим освобождением (requestWithURL). Если вы хотите, чтобы он был сохранен вашим кодом, либо позвоните по нему retain
, либо используйте метод initWithURL:
.
Кроме того, переменная results
не сохраняется вами, поэтому ее не нужно освобождать.