Существует также некоторая путаница в вашем управлении памятью, здесь:
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
B* der = [[B alloc]init];
[der p];
[pool drain];
Вы создаете и истощаете пулы автоматического выпуска, чтобы помещать в них вещи (после создания), а затем сразу же избавляться от них (по мере того, как вы сливаете их). Но вы ничего не положили в бассейн. Вы использовали «alloc» для создания «der», что означает, что вы «владеете» им в целях управления памятью, а не помещаете его в пул авто-выпусков, где об этом позаботятся автоматически.
Если все, что я сделал, это еще больше сбил вас с толку, то вам, вероятно, стоит ознакомиться с вводной книгой по Objective-C. Все они освещают эту тему в какой-то момент. Или вы можете посмотреть документы Apple по управлению памятью, но они предполагают, что вы уже знаете определенные вещи. (И это сбивает с толку, так что наберитесь терпения ...)