Во-первых, вернитесь назад и перечитайте правила управления памятью , просто чтобы убедиться, что вы не упускаете ничего очевидного при использовании делегата в другом месте.
Затем включите NSZombieEnabled (в ваших настройках исполняемого файла, на панели «Аргументы» добавьте переменную окружения NSZombieEnabled, для которой установлено значение YES).
Затем добавьте метод dealloc в ваш delagate, если у него его еще нет (обязательно вызовите [super dealloc]!), И поставьте точку останова - он сообщит вам, когда ваш delagate будет освобожден, и сообщит вам когда он будет выпущен.
В качестве альтернативы, добавьте тривиальные методы release / autorelease к вашему классу делегата, которые не делают ничего, кроме вызова, и затем остановите их, и это точно сообщит вам, когда он будет освобожден.
Три заключительных комментария: в стандартном соглашении об именах для Objective C / Cocoa вы должны иметь поля параметров в нижнем регистре, т.е. это должно быть:
- (id)initWithFrame:(CGRect)aRect cols:(NSUInteger)Cols rows:(NSUInteger)Rows;
Когда ваш ivar и свойство имеют одинаковые имена, очень легко случайно использовать неправильное, поэтому я рекомендую использовать другое имя и имя ivar, чтобы избежать путаницы, либо используйте префикс _, например Apple, либо другой префикс. чтобы избежать путаницы с Apple:
id<SomeDelegate> _someDelegate;
@synthesize someDelegate = _someDelegate;
И Apple рекомендует не использовать сеттеры / геттеры в init / dealloc, поэтому ваш код инициализации должен быть:
_someDelegate = [[SomeObject alloc] initWithCols:cols Rows:rows];