Да, вы протекаете. Вы создаете собственный объект с помощью +alloc/-initWithFrame:
, а затем присваиваете этот принадлежащий объект свойству, помеченному retain
. Это создает вторую ссылку на объект. На этом этапе вы теряете исходную принадлежащую ссылку, что приводит к утечке самого объекта.
Правильное поведение здесь - вызвать -autorelease
для объекта, прежде чем присвоить его свойству.
self.mySwitch = [[[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 40, 20)] autorelease];
На тангенциальной ноте не рекомендуется обращаться к свойствам внутри -dealloc
. Для этого обычно приводятся две причины: 1) это будет передавать уведомления KVO, которые вам не нужны внутри -dealloc
, и 2) если кто-либо переопределит сеттер (в этом классе или подклассе), он может не работать должным образом. Рекомендуемый подход - просто выпустить базовый ivar, чтобы вместо этого вы увидели что-то вроде следующего:
[mySwitch release];
Назначение nil для свойства совершенно безопасно (и рекомендуется) везде.