Вы не должны выпускать currentTime. Вы не получили его через что-то с «new», «alloc», «retain» или «create» в имени, так что вы не являетесь его владельцем. То, что вы делаете, это выделяете несвязанную строку и передаете ее в label.text, а затем не можете ее освободить. Предлагаю заменить эти три строки просто:
NSString* currentTime = [theDate stringFromDate:[NSDate date]];
label.text = currentTime;
Это зависит от UILabel, чтобы сохранить строку, если она хочет сохранить ее (я ожидаю, что так и будет, но это деталь реализации и ни одна из наших задач в любом случае), и вы не являетесь ее владельцем, поэтому можете просто оставить ее истечь в пуле авто-релиза.
В том же методе вы также создаете NSFormatter с именем 'theDate' и не можете его освободить. На самом деле, вы, кажется, немного запутались в методах получения и установки, что неудивительно, поскольку здесь присутствует немного наследия Objective-C. Если вы делаете что-то вроде:
theData = ...whatever...;
Затем вы непосредственно скопируете значение, указанное в переменную, согласно обычному оператору C '='. Там нет магии Objective-C там. Является ли и как вы объявили свою собственность (в значительной степени, см. Примечание) не имеет значения.
Если вам что-то нравится:
self.theData = ...whatever...;
Тогда компилятор будет действовать точно так же, как если бы вы написали:
[self setTheData:...whatever...];
Таким образом, вы получите вызов метода и ваш фактический установщик будет использован. Сеттер будет делать все, что вы ему сказали, через @ property / @ synthesize (т.е. сохранять, копировать или назначать). Следовательно, в dealloc вы склонны видеть либо:
- (void)dealloc
{
[property1 release];
[property2 release];
[super dealloc];
}
Или:
- (void)dealloc
{
self.property1 = nil;
self.property2 = nil;
[super dealloc];
}
Которые имеют тот же общий эффект со свойствами 'retain' (хотя последний фактически выпускает оригинал, затем сохраняет 'nil', любое сообщение 'nil' не имеет никакого эффекта).
Та же путаница, возможно, влияет на использование вами ярлыка, но то, что вы делаете в данный момент, технически правильно. Если бы вы использовали 'self.label =' вместо прямого присваивания, то вам нужно было бы передать объект с автоматическим выпуском или объект, который вы знаете, как выпустить позже.
Дополнение: стоит проверить NSZombies и инструмент Leaks в Instruments; первая поможет вам узнать, когда и как вы обращаетесь к освобожденным объектам, вторая поможет вам определить, когда у вас происходит утечка памяти. Guard Malloc также полезен для первых, но имеет гораздо большие накладные расходы, и я не уверен, насколько хорошо он работает с iOS в настоящее время.
(примечание: в современных 64-битных средах и средах ARM переменные экземпляра являются динамическими с практическим эффектом, заключающимся в том, что вы можете объявлять их чисто с помощью @property и @synthesize, не помещая их иначе в объявление @interface; если вы если вы сделаете это, то, очевидно, наличие или отсутствие @property повлияет на работу прямого доступа.