Objective-C, владение и методы класса - PullRequest
1 голос
/ 13 декабря 2011

Во-первых, я новичок в Objective-C. :)

Я узнал, что все, что начинается с alloc, new и copy, дает право собственности вызывающей стороны на возвращаемый объект. Это также относится к методам класса? Я предполагаю, что делает , и недавний сбой в одном из моих модульных тестов, кажется, подтверждает это. В расширенном руководстве по программированию для управления памятью от Apple ничего не говорится о том, есть ли разница между методами класса и экземпляра.

Обновление То, что я имею в виду, что это также относится к методам класса, на самом деле является «обратным». Например, NSDecimalNumber имеет метод класса с именем +decimalNumberWithDecimal:. Кажется, он возвращает автоматически освобожденный объект (если я его освобождаю явно, вскоре после этого происходит сбой). Оглядываясь назад, ответ на мой вопрос очевиден, поскольку руководство Apple ссылается на new и alloc как методы предоставления прав собственности, и все они являются методами класса. Извините, что заняли ваше драгоценное время. :)

Ответы [ 3 ]

3 голосов
/ 13 декабря 2011

Также alloc и release.init не указывает на право собственности, вы, вероятно, смешиваете это с alloc.Вы можете легко запомнить его с помощью мнемоники NARC .

Если вы называете какие-либо методы класса init, copy или retain, вы должны остановить это.Это методы, которые имеют смысл только в контексте экземпляров.alloc и new являются методами класса и должны использоваться только в этом контексте.Не называйте методы экземпляра alloc или new.

Причина, по которой в руководстве не сказано, что оно применимо как к методам экземпляра, так и к методам класса, заключается в том, что рассматриваемые методы явно представляют собой смесьи то и другое, так что, очевидно, это так.

3 голосов
/ 13 декабря 2011

На самом деле, это почти правильно. alloc, new и copy дают вам право собственности на возвращенный объект. Это классовые методы. Другие методы класса должны возвращать автоматически освобожденный объект. Методы экземпляра также должны возвращать автоматически освобожденный объект.

init не влияет на владение и должен использоваться вместе с alloc следующим образом.

[[SomeCoolClass alloc] init]

new обычно является тем же самым, что и выше, и иногда описывается как «почти устаревший», потому что это возврат к следующим дням, когда распределение и инициализация были выполнены на одном шаге и не могут быть построены отдельно. мы делаем сегодня с alloc и init.

Релиз не влияет на владение, но должен использоваться только для объекта, которым вы уже владеете. В противном случае возможен сбой.

Сохранение также не влияет на владение, но должно использоваться только для объекта, которым вы уже владеете. В противном случае объект не может быть освобожден, когда он должен быть. Результатом может быть сбой, но это может быть очень и очень странное поведение, которое трудно устранить, поскольку сообщения могут отправляться исходному объекту, который, как предполагалось, был освобожден, вместо нового объекта, на который указывает тот же адрес.

3 голосов
/ 13 декабря 2011

Да, это относится к методам класса, так как alloc и new - это методы класса, которые возвращают владелец вызывающей стороне. Префикс copy или mutableCopy должен использоваться, например, для методов, возвращающих владение.

Изменить для обновления:

Вы правы, что метод, подобный +decimalNumberWithDecimal:, должен возвращать автоматически освобожденный объект, поэтому нет причин для его освобождения. Однако, если они решили назвать метод +newNumberWithDecimal:, то у вас будет право собственности на возвращенный объект, и вам необходимо его освободить. Статический анализатор Clang на самом деле будет жаловаться, если вы добавите префикс метода к new и вернете автоматически освобожденный объект.

...