В вашем коде есть только одно место (из того, что мы видим), где текстура может быть освобождена, и это в выражении [texture release];
.
Вам нужно выполнить это утверждение (или другое где-то еще). Вы проверяли, что для каждой выделенной текстуры вы также освобождаете ее? Вы можете добавить операторы NSLog, чтобы помочь, например так:
if (texture != nil) {
NSLog("releasing texture instance: %08x", texture);
[texture release];
texture = nil;
} else {
...
texture = [[Texture2D alloc] initWithImage:ui];
NSLog("allocated texture instance: %08x", texture);
}
Возможно, текстура сохраняется где-то еще? Например, вы добавляете его в подпредставление или в массив или словарь? Те сохраняют свое содержание.
В качестве последнего средства для действительно сложной проблемы отслеживания выделения / выпуска я переопределил методы retain, release, dealloc, чтобы убедиться, что они вызываются, когда я ожидаю. Это может быть излишним в данный момент, но вот как: я добавил int myRetainCount;
ivar, чтобы помочь мне отслеживать:
-(void)release {
NSLog(@"release %08x %2d -> %2d (%u)",
self, myRetainCount, myRetainCount-1, self.retainCount);
myRetainCount--;
[super release];
}
-(id)retain {
NSLog(@"retain %08x %2d -> %2d (%u)",
self, myRetainCount, myRetainCount+1, self.retainCount);
myRetainCount++;
return [super retain];
}
- (void)dealloc {
NSLog(@"dealloc %08x %2d (%u)", self, myRetainCount, self.retainCount);
// deallocate self's ivars here...
[super dealloc];
}