В первом примере вы выделили объект (один раз) и освободили его (один раз), поэтому вам больше ничего не нужно делать. С другой стороны, viewLoading становится недействительным, как только вы отправляете релиз в viewLoading2, так что это не очень полезный код.
Во втором случае вы еще не выпустили viewLoading, так что в конце концов это нужно сделать.
В-третьих, любой код, выделивший объект, который был передан в этот метод через параметр, отвечает за его освобождение. Он должен быть действителен в течение всего срока действия этого метода, но если вы сохраняете его для дальнейшего использования, вам необходимо сохранить его здесь, а затем отпустить, когда вы закончите.
Edit:
Я не уверен, что понимаю ваш вопрос 4. Объявление в файле интерфейса (.h) просто резервирует место для указателя. Это не объявление объекта, поэтому выпуск не требуется, пока вы на самом деле не сделаете выделение объекта.
self.viewloading = viewLoading2
использует метод установки свойств для выполнения назначения. Если в операторе @property есть «retain», то сохранение выполняется как часть этого присваивания. `viewloading = viewLoading2" - прямое назначение, без сохранения.