[xxx release];
self.xxx = nil;
Это неверно, так как xxx будет выпущен дважды, рекомендуемый способ - выпустить iVar и установить его равным nil, не используя свойство:
[xxx release];
xxx = nil;
Причина не просто использования
self.xxx = nil;
заключается в том, что вызывающий метод setter может иметь некоторые побочные эффекты, которые могут вызвать проблемы в методе dealloc (то есть использовать другой iVar, который уже может быть освобожден)