Установка указателя в ноль не освобождает память, занятую предыдущим местом назначения этого указателя. Говоря простым языком, присвоение ему значения nil не не освобождает его.
Если ваше приложение собирает мусор, освобождение не выполняется и может быть исключено. В остальном это очень и очень нужно. Следовательно, способ 1 всегда правильный, а способ 2 - только при сборке мусора.
Примечание : Этот ответ не относится к проектам, использующим автоматический подсчет ссылок. В ARC установка указателя на nil не отправляет релиз объекту.
Как сказал BJ, установка значения nil не освободит память, а в среде, не собранной с помощью gc, вызовет утечку памяти. Альтернативой, которая, возможно, также была бы действительной, была бы
MyClass *obj = [[[MyClass alloc] init] autorelease];
obj = nil;