Немного не по теме - у Бена есть ответ, который вы ищете, но логика в вашем коде немного извилистая.
- (void)setName:(NSString *)aString {
if ((!name && !aString) || (name && aString && [name isEqualToString:aString])) return;
[name release];
name = [aString copy];
}
На самом деле вам не нужно проверять (!name && !aString)
это безопасная и распространенная практика - переназначить ноль на ноль и отправить сообщение об освобождении (или любое сообщение) на ноль. Во время выполнения замыкается последний, а оптимизатор удаляет первый. Если установка nil-имени является ошибкой, вы должны заявить, что aString не nil
Точно так же строки NSS очень хорошо оптимизированы. Не пытайтесь оптимизировать случай, когда вы устанавливаете имя автомобиля на имя, которое уже установлено. Фактически, ваша проверка [name isEqualToString:aString]
, которую вы берете каждый раз, когда кто-то устанавливает ненулевую строку, медленнее, чем выпуск и копирование, которых вы избегаете в меньшем количестве случаев.
Если вы проверите, что происходит при отправке копии на строку NSString, вы обнаружите, что она просто увеличивает количество сохраняемых данных. Обратите внимание, что это не так для NSMutableString по очевидным причинам; -)
Хорошее эмпирическое правило - оптимизируйте, когда у вас есть все функциональные возможности, и оптимизируйте только то, что медленное (или большое).
наконец, следуя комментариям Бена о присвоении имен, я бы переименовал aString в aCarName или что-то еще более информативное - опять же, ваше будущее я будет вам благодарно.