Утечка памяти - это память, на которую указывает value
.
Каждый раз, когда изменяется ваше текстовое поле, метод stringByReplacingCharactersInRange...
возвращает автоматически освобожденный объект NSString.Вы правы, чтобы сохранить его, чтобы он не был освобожден.Проблема в том, что у вас сейчас есть память где-то.(Вы владеете этой строкой NSString, сохранив ее.)
При следующем вызове этого метода, когда пользователь изменяет текст в этом поле, вы указываете value
на совершенно другую область памяти.Первоначальная память, которую вы сохранили, все еще существует и будет существовать вечно.(Поскольку вы никогда не выпускали его.)
очень важно сопоставлять любые вызовы retain
метода с соответствующими release
.Вы можете сделать:
...
if (value) {
[value release];
}
value = ...;
...
ИЛИ
Вы можете определить NSString *value
как свойство вашего класса, например:
@property (nonatomic, retain) NSString *value);
/* Implementation file */
@synthesize value;
Затем просто используйте:
...
self.value = ...;
...
Кроме того, поскольку у вас всегда будет сохраненная память после вызова этого метода, вам нужно будет освободить value
, когда ваш класс освобожден, какбыло упомянуто в другом ответе:
- (void)dealloc {
// Only do *one* of the two following releases
// (1) If you're not using properties:
[value release];
// (2) If you are using properties:
self.value = nil;
[super dealloc];
}
Редактировать: Похоже, что вы обязательно должны прочитать руководство по управлению памятью Apple, прежде чем продолжить: http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/MemoryMgmt.html