Если obj1 и obj2 являются свойствами, использующими методы доступа @ synthesize-d, то метод 1 и метод 2 эквивалентны. Если какое-либо из этих двух условий не соответствует действительности, то эффект довольно различен. Если они не являются свойствами, то метод 2 просто устанавливает указатели на ноль, не делая ничего, что могло бы освободить объекты. И если они являются свойствами, но вы реализовали свои собственные методы установки, метод 2 вызывает эти методы с «nil» в качестве аргумента. Это эквивалентно методу 1 или нет, зависит от того, как вы реализовали эти методы. Если ваши пользовательские сеттеры делают что-либо значимое, когда аргумент равен nil, метод 2 гарантирует, что этот код будет выполнен.
Как сказал Марко, метод 3 просто неправильный. Если вы видели пример кода, делающего это, то автор может на самом деле не знать, что он делает.