Как узнать, является ли объект автореализованным или нет?
Я немного раздражен тем, что некоторые объекты, автореализованные без меня, знают. Это, наверное, хорошо, что они есть, но если они есть, я хочу знать. В документации не указано, какие методы являются объектами autorelease, поэтому я обычно проверяю свой путь вперед, что, на мой взгляд, глупо. Например, [NSDate date] автореализует объект, а также [NSArray arrayWithObjects:...]. Как вы знаете, не сообщив вам документацию?
Я начинаю видеть шаблон, хотя такие методы, как эти, те, которые создают объекты со статической функцией, всегда возвращают автореализованный объект. Это всегда так?
Ответы
Ответ 1
В принципе, если вы init
, copy
или retain
объект, за который вы отвечаете за его освобождение. Если вы этого не сделаете, вы не отвечаете за его освобождение.
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html
Многие классы предоставляют методы form + className..., которую вы можете использовать для получить новый экземпляр класса. Часто упоминается как "удобство конструкторы", эти методы создают новый экземпляр класса, инициализировать его и вернуть его для использования. Хотя вы можете подумать, что вы ответственный за выпуск объектов созданный таким образом, то есть не дело в соответствии с собственностью политика, изложенная ранее. Поскольку класс создает новый объект, это ответственный за распоряжение новым объект.
Ответ 2
Подпись самого метода сообщает вам. Шаблон для методов с сигнатурами типа "classNameWithData: data1: data2" должен возвращать экземпляр alloc/init/autorelease этой вещи. Здесь есть удобства, так что вам не обязательно это делать.
Если вам не нужна версия с авторезистентностью, тогда не создавайте экземпляр их таким образом и не используйте соответствующие alloc/init и не отпускайте, когда вы закончите. Этот метод гораздо более явный и немного более склонный к ошибкам, потому что, если будет создано исключение, ваш выпускный блок может быть пропущен, но это цена, которую вы платите за его использование.