Если вы определяете @property
, то, как правило, каждый раз, когда вы получаете доступ к ивару в вашем классе, вы используете метод получения / установки, будь то точечная запись или стандартный вызов метода.
Точечная запись
id localyMyVar = self.myVar;
self.myVar = @"A string";
Стандартный вызов метода
id localMyVar = [self myVar];
[self setMyVar:@"A string"];
Если вы всегда явно используете эти методы получения и установки, тогда вам почти не нужно вызывать release где-либо в вашем кодекроме dealloc
или переопределенного setMyVar:
метода.Это позволяет управлять памятью в ограниченных местах.Если вы начнете отпускать и удерживать себя, то все может быть немного сложнее, когда вы только начинаете.
ОБНОВЛЕНИЕ
@ bbum даст вам ответ, но я думаю, вы быВы также можете быть более последовательными в своем кодировании.
Например, перед ошибочной строкой, которую вы назначаете непосредственно ивару без использования установщика.Будьте последовательны и используйте setter / getter, который вы нашли время, чтобы синтезировать.Я бы переписал
tools = [[[TransparentToolbar alloc]
initWithFrame:CGRectMake(0, 0, 70, 44.01)] autorelease];
tools.barStyle = UIBarStyleBlackOpaque;
на
TransparentToolbar *tmpTools = [[TransparentToolbar alloc] initWithFrame:CGRectMake(0, 0, 70, 44.01)];
tmpTools.barStyle = UIBarStyleBlackOpaque;
self.tools = tmpTools;
[tmpTools release]; tmpTools = nil;
Ваши init
методы на самом деле не следуют рекомендациям, либо вы должны проверить, что self
на самом деле установлено, поэтому оно должно выглядетьчто-то похожее на:
- (id)init
{
self = [super init];
if (self) {
[self applyTranslucentBackground];
}
return self;
}
ОБНОВЛЕНИЕ
Утечка памяти, которую вы видите здесь:
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.tools];
, потому что вы смотрите на документыдля UINavigationItem вы увидите, что rightBarButtonItem
объявлен как retain
@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem
Следовательно, вызов self.navigationItem.rightBarButtonItem
займет +1 удержание для объекта, который вы передаете, а затемВы выделяете / инициируете, что является еще одним +1 удержанием.UINavigationItem
высвободит свое удержание, когда оно будет освобождено, но все равно будет сохраняться ваше первоначальное удержание.
Исправление:
UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.tools];
self.navigationItem.rightBarButtonItem = rightBarButtonItem;
[rightBarButtonItem release]; rightBarButtonItem = nil;