Мне нужна хорошая аналогия, чтобы понять методы класса против методов экземпляра - PullRequest
3 голосов
/ 09 января 2010

Я в замешательстве, потому что книга, которую я читаю, копается в классе NSNumber и рассказывает обо всех различных методах, которые вы можете вызвать в нем. У меня есть пара вопросов:

1.) Вам не нужно вызывать типичный alloc или init для базовых классов?

2.) В каких случаях вы используете, скажем, numberWithChar: в отличие от initWithChar (я думаю, что это та часть, которая меня больше всего запутывает, не совсем уверенный, что я выдвигаю эту концепцию на том уровне, который мне нужен, чтобы быть Если бы вы, ребята, могли бы сломать это для меня, я думаю, что это действительно помогло бы мне преодолеть эту горбатую роу.

Спасибо

Ник

Ответы [ 3 ]

3 голосов
/ 09 января 2010

Класс / Экземпляры-аналогии

Классы, как чертежи для типового дома. Экземпляры похожи на настоящие дома. Таким образом, вы можете иметь только один план для одного типа дома, но вы можете иметь несколько реальных домов одного типа. Кроме того, у вас может быть несколько чертежей, и каждый план описывает свой тип дома.

Другая аналогия, которую вы можете использовать, заключается в том, что классы похожи на формочки для печенья, а экземпляры похожи на файлы cookie, изготовленные из формочки.

Как это относится к Objective-C

Существует один "объект класса" для каждого класса в вашем коде. Чтобы сослаться на объект класса, вы просто используете имя класса. alloc - это метод класса, который выделяет новый экземпляр следующим образом:

MyWidget* w = [MyWidget alloc];

Однако alloc не инициализирует класс, поэтому ни одна из переменных-членов не будет установлена. init - это метод экземпляра , который инициализирует вновь выделенный экземпляр. Итак, чтобы выделить и инициализировать новый экземпляр, вы делаете это:

MyWidget* w = [[MyWidget alloc] init];

Что эквивалентно этому:

MyWidget* w = [MyWidget alloc]; //alloc is being called on the class
w = [w init]; //init is being called on the instance

Другим распространенным типом метода класса является фабричный метод, такой как numberWithChar:. Это в основном то, что numberWithChar: делает:

+(NSNumber*) numberWithChar:(char)c;
{
    return [[[NSNumber alloc] initWithChar:c] autorelease];
}

Единственная реальная разница в том, что numberWithChar: возвращает автоматически освобожденный объект.

Все объекты должны быть выделены и инициализированы. Это включает базовые классы.

3 голосов
/ 09 января 2010

1) alloc и init необходимо вызывать практически всегда. numberWithChar - это удобный метод, который означает, что он вызывает для вас alloc, init и autorelease и возвращает автоматически выпущенный экземпляр.

2) Так как numberWithChar возвращает автоматически выпущенный объект, это означает, что, если вы не сохраните его (или не передадите ему что-то вроде NSArray, которое будет retain), он вскоре будет уничтожен. initWithChar возвращает объект retain, что означает, что вы должны освободить его, когда закончите с ним.

Я обнаружил, когда начинал, что было полезно использовать init - alloc, как правило, вместо удобных методов, потому что это заставило меня обратить пристальное внимание на управление памятью.

Разница между методами класса и экземпляра рассматривается в нескольких ответах на этот вопрос В чем разница между методами класса и экземпляра?

EDIT:

Если честно, аналогия, которую я использую, когда вызываю метод класса, скажем, NSString, молится богу NSStrings, чтобы даровать мне великолепный новый NSString. Обратите внимание, что методы класса почти на 100% используются для создания. например alloc - это метод класса, stringWithFormat - это метод класса и т. Д.

Да, это смешно, я знаю.

1 голос
/ 09 января 2010

Хорошо, первое: в Objective-C вы не вызываете метод , вы отправляете сообщение объекту. Среда выполнения ищет методы и вызывает их.

Это может помочь вам думать о классе как о фабрике. Фактически, много лет назад мы называли методы класса фабричными методами.

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