Инструменты Живой Счет и / или Оставить Счет Количество - PullRequest
0 голосов
/ 28 июня 2010

Я столкнулся с проблемой сохранения счета, которую я не понимаю.(Я добавил то, что я считаю количеством сохраняемых вершин в [] в конце каждой строки кода).

CBVertex *vertex = nil;
for(int i=0; i<10; i++) {
    vertex = [[CBVertex alloc] initWithFrame:CGRectMake(minX, y, 10.0, 10.0)]; // retain count [1]
    [vertex setTag:i];
    [vertex setAnimationDelegate:self];
    [gameboard addSubview:vertex];   // retain count [2]
    [tripGraph addVertex:vertex];    // retain count [3]
    [vertex release]; vertex=nil;    // retain count [2]
}

CBVertex - это подкласс UIView, игровая доска - это UIView, а tripGraph - это класс, который, помимо прочего, имеет NSMutableArray (privateVerticies), к которому добавляется вершина в его методе addVertex.

После выполнения вышеприведенного, Instruments показывает, что существует 10 экземпляров CBVertex.

Позже в выполнении кода (я подтвердил, что этот код выполняется):

[[tripGraph verticies] makeObjectsPerformSelector:@selector(removeFromSuperview)];
// gameboard should have no references to any of the CBVertex's (correct??)

[tripGraph removeAllVerticies]; 
// tripGraph privateVerticies is empty and  no references to any of 
// the CBVertex's (correct?)

Соответствующие методы tripGraph:

-(NSArray *) verticies {
   return [NSArray arrayWithArray:privateVerticies];
}

-(void) tripGraph removeAllVerticies {
   [privateVerticies removeAllObjects];
}

- (void) addVertex:(CBVertex *)vertex {
   [privateVerticies addObject:vertex];
}

Проблема возникает при создании второго набора CBVertex.Инструменты показывают, что первый набор CBVertex все еще жив (то есть число экземпляров CBVertexs теперь составляет 20).

Я (очевидно?) Где-то пропускаю релиз, но не понимаю, где.,,

Помощь / указатели приветствуются !!

спасибо

Том

Ответы [ 3 ]

0 голосов
/ 28 июня 2010

ОК, я закрываю это, так как код выше верен.Проблема заключается в моем переопределенном методе removeFromSuperview, в котором происходит анимация.Я собираюсь продолжить расследование, и если я не выясню это, я отправлю новый вопрос.(и ссылка на него здесь).

Спасибо за комментарии, ответ и несколько просмотров.

0 голосов
/ 30 июня 2010

Для тех, кто заинтересован, вот что происходит и как это решается.

В CBVertex я переопределил removeFromSuperview. В этом переопределенном методе я анимирую слой представления и устанавливаю представление как делегат CAAnimations (который сохраняется CAAnimation) и вызываю super removeFromSuperview. Анимация не удаляется после завершения.

Поскольку анимация сохраняет делегата и , анимация не удаляется, счетчик сохранения представления остается на + 1.

Мое решение было создать промежуточный метод для выполнения анимации. Когда анимация завершена, она вызывает переопределенное removeFromSuperview, которое теперь только удаляет все анимации и вызывает super. Удаление анимации приводит к ее освобождению, которая, в свою очередь, освобождает ссылку на своего делегата (CBVertex), и счетчик сохранения CBVertex становится равным +0.

Одна заключительная мысль для тех, кто преследует, сохранить счет: не думайте о них как об абсолютных значениях. Внутренняя работа объектов, которые вы можете использовать, может удерживать ваши экземпляры больше, чем вы ожидаете, - думайте о сохранении счетчиков как о дельте.

SomeClass *myObject = [[SomeClass alloc] init]; // retain count +1
[someMutableSet addObject:myObject]; // retain count +2
0 голосов
/ 28 июня 2010

Если gameboard и tripGraph все еще сохраняют этот объект CBVertex, то даже если вы отпустите его в цикле, он будет существовать до тех пор, пока вы не удалите объект CBVertex из gameboard и tripGraph а также.

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