Как освободить объект, переданный в протокол или метод делегата в Objective-c? - PullRequest
0 голосов
/ 15 октября 2010

Как и когда освобождается объект IndexPath, который возвращается в UITableViewDelegate?

давайте представим код:

//my method in my object
{
    NSNumber *number=[[NSNumber alloc] init];
    number=[[self methodreturningnumber] retain];

    [delegate didSelectItemAtIndex:number];
}

в моем делегате у меня есть метод:

-(void)didSelectItemAtIndex:(NSNumber *)number
{
}

когда объект NSNumber, созданный в первом методе, должен быть освобожден?Если я использую autorelease или опубликую его в методе, он не будет доступен в моем делегате.Если оставить все как есть, может быть утечка памяти

Ответы [ 2 ]

4 голосов
/ 15 октября 2010

Просто отпустите его после , когда вы вызываете метод делегата (или используете autorelease).

Вызов делегата - это обычный вызов метода, поэтому он происходит синхронно. (И если делегат действительно хочет удержать объект и использовать его позже, делегат должен retain его. Основное правило управления памятью в Какао состоит в том, что каждый метод отвечает за сохранение (и последующее освобождение) предметы, которые нужно держать рядом.)

Также обратите внимание, что в вашем примере есть еще одна утечка памяти: вы набираете alloc число, а затем присваиваете ему другое значение (утечка исходного значения).

Предполагая, что methodreturningnumber возвращает автоматически освобожденный объект, вам не нужно выполнять дополнительное управление памятью; просто:

NSNumber *number=[self methodreturningnumber];
[delegate didSelectItemAtIndex:number];
0 голосов
/ 15 октября 2010

Я только что проверил после изменения, он работает, но isse появляется на следующем шаге если я попытаюсь использовать эту переменную позже, она будет потеряна.

Я изменил имена объектов, чтобы облегчить анализ:

//my method in my object  OBJ2
{
[delegate didSelectItemAtIndex:[self methodreturningnumber]];
}

в моем делегате (OBJ1) у меня есть метод:

-(void)didSelectItemAtIndex:(NSNumber *) NSNUMBER
{


SliceDetailsViewController * OBJ2 = [[SliceDetailsViewController alloc] initWithNibName:nil bundle:nil];
OBJ2. NSNUMBER = NSNUMBER;    //          <----------  THIS IS LOST IF I DON'T ADD RETAIN   [NSNUMBER retain]
OBJ2.pieChart = graphView;
OBJ2.myColors=myColors;

[self presentModalViewController:sliceDetailsController animated:YES];

[sliceDetailsController release]; 
}

в моем modalWindow (OBJ3) у меня есть метод, который вызывается из его подпредставления OBJ4

- (void)colorPicker:(ColorPicker *)myColorPicker didSelectItemAtIndex:(NSNumber *)indexPath
{
[OBJ2 setColor:NSNUMBER value:indexPath];     //      <------ SLICEID IS NOT AVAILABLE HERE IF NOT RETAINED IN PREVIOUS OBJECT

}

OBJ4 вызывает этот метод выше:

[delegate colorPicker:self didSelectItemAtIndex:atrribute];

........... вызываемые методы из объектов: OBJ1 -> OBJ2 -> OBJ1 -> OBJ3 -> OBJ4 -> OBJ3

OBJ1 вызов OBJ2 (передача себя в качестве делегата) OBJ2 генерирует NSNumber X и вызывает метод OBJ1 с NSNumber X

OBJ1 вызывается как presentModalViewController OBJ3 и устанавливает X как один из атрибутов OBJ3

OBJ3 отображается правильно и имеет доступ к NSNumberX

OBJ3 Подвиг класса VievController OBJ4 (представление отображается на том же экране)

когда я нажимаю на OBJ4, он вызывает метод OBJ3 без аргументов и OBJ3 имеет адрес NSNumber, но он выходит за рамки.

..........

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...