Цель C Управление памятью - PullRequest
       33

Цель C Управление памятью

0 голосов
/ 27 сентября 2019

Я довольно новичок в Objective C и сейчас читаю книгу (Learning Objective C на Mac 6th edition).Я на 9-й главе (Управление памятью) и застрял на одном примере.Они дают вам класс Car, Tire и Engine, класс Car имеет 2 члена-экземпляра, указатель на Engine и один для массива из 4 Tire.Все эти классы имеют свои методы Accessors (Getters и Setters) для переменных экземпляра.Затем, когда они объясняют, какова лучшая стратегия управления памятью (при освобождении или сохранении retainCount для освобождения) для темы владения объектом, они говорят следующие метки состояния для кода на изображении: enter image description here

ПРИМЕЧАНИЕ. engine, показанное в методах setEngine, относится к одной из переменных экземпляров класса Car

Почему переменная engine экземпляра объекта car2 такая же, какАргумент нового двигателя?

1 Ответ

1 голос
/ 27 сентября 2019

Почему переменная экземпляра движка объекта car2 совпадает с аргументом newEngine?

Вопрос в том, что произойдет , если выназывается

[aCar setEngine: anEngine];

... в то время, когда anEngine является тем же объектом , что уже engine из aCar.Предположим, вы сделали это.Тогда первое, что делает реализация setEngine, это освобождает существующий engine.Но если этот объект также newEngine, то вы теперь случайно сбросили входящий параметр, прежде чем получили возможность назначить его для ивара и сохранить его.

Урок заключается в том, чтовам нужно сохранить входящий параметр сначала и , затем освободить существующий engine - на тот случай, если это один и тот же объект.Или, что еще лучше, проверьте , являются ли они одним и тем же объектом, как я советую в своей книге:

http://www.apeth.com/iOSBook/ch12.html#_memory_management_of_instance_variables_non_arc

Сказав все это, я настоятельно рекомендуюты выбрасываешь эту книгу.Это слишком старо. Никто больше не пишет такой код.В настоящее время у нас есть ARC, которая делает все это автоматически , именно так, что вам не нужно.В современном Objective-C высказывание retain и release на самом деле незаконно .Таким образом, вы узнаете о том, что вы никогда не будете делать на самом деле, что глупо.Вы изучаете мертвый язык.Это весело, но не полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...