Когда вызывается ваш метод set, вы не знаете, каков счет сохранения передаваемого объекта. Это может быть 1, а release может быть вызван сразу после вызова метода set.
Задача метода set - указывать, что объект нельзя освобождать, вызывая для него команду retain.
Что касается вызова release, когда устанавливается новое значение, ваш метод set должен вызывать release для старого значения, чтобы указать, что оно больше не нужно.
Наконец, вам следует вызвать retain для нового значения и release для старого значения в указанном порядке, потому что, возможно, вам будет передано точно такое же значение, которое уже было установлено.