Терминологический вопрос о Objective-C / iOS - PullRequest
3 голосов
/ 05 января 2011

Извините, если это звучит немного странно, я все еще относительно новичок в ObjC и iOS, но не новичок в разработке программного обеспечения, однако при чтении документов / просмотре видео на различные темы я слышу некоторые фразы, которые я я не уверен, может ли кто-то уделить минуту, чтобы дать очень краткое описание следующих терминов, или указать мне хороший справочник для них.

Я перечислю ниже термины, с которыми я застрял, и то, что, как мне кажется, я понял, это означает / означает, и любая помощь в исправлении меня, чтобы я мог лучше следить за потоком документации Apple, будет высоко оценена.

1) Синглтон

Возможно, похож на полностью статический класс в PHP, не имеет методов экземпляра

2) Организация модели, вида, контроллера (MVC) - в частности, компонент «модель»

Я знаю, что широкое определение - держать вещи отдельно, и я думаю, что это равнозначно тому, что ваш взгляд был бы тем, что вы строите для вывода на экран либо программно, либо в конструкторе интерфейса, контроллер - это код, который обрабатывает сообщения (щелчки , нажимает и т. д.) из представления и выталкивает информацию в представление, хотя во многих случаях пары .xib и .h / .m, которые формируют представление и контроллер, являются частью одного семейства (то есть MyViewController.h / .m / .xib ). Моя догадка заключается в том, что отдельные обработчики для чтения и записи данных в / из источника, например, класс, в который вы отправляете сообщения, могут загружать и возвращать данные из базы данных SQLite или из фида XML и обрабатывать их.

3) Где правильное место для *, когда речь идет о типах объектов?

Я знаю, * означает указатель, но я видел вещи, написанные ниже, выглядящие так, как будто они означают одно и то же:

NSString *myVar;
NSString* myVar;
NSString * myVar;

Я понимаю, что * идет после типа в заголовке сообщения, например:

- (void)myMessageHandler:(NSString *)str;

4) Когда использовать NSInteger вместо простого int?

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

5) Повторно используемые идентификаторы сущностей

При удалении из очереди / создании объектов, которые работают через очередь повторного использования, я вижу один и тот же идентичный идентификатор, используемый каждый раз (например, для UITableViewCell, @ "cellIdentifier"). Тем не менее, я вижу, что ячейка сбрасывается с соответствующими данными строки каждый раз, а не просто сохраняется в очереди, эта путаница возникает из таблиц в HTML, где для адресации каждой строки вы пересекаете DOM или добавляете тег ID в каждая строка уникальна.

Я думаю, что это вещь управления памятью, при которой вы не заметите, что происходит, если вы используете класс по умолчанию, но если вы используете разные пользовательские классы, я предполагаю, что идея состоит в том, что вы создаете экземпляр только для каждого типа для экземпляра родительского класса (например, UITableView), так что даже если вы каждый раз сбрасываете свойства, требуемая общая память минимальна, а время создания вынимается из цикла, как вы делаете это только один раз?

Часть 2 к этому вопросу будет, если у меня есть приложение, в котором несколько контроллеров представления помещены друг на друга, было бы целесообразно использовать уникальный идентификатор, который относится к конкретному представлению, поэтому, если бы я использовал пользовательские подклассы, идентификаторы не будут вызывать совпадения и, возможно, утечку памяти.

Например, UITableView выдвигает карту, которая выдвигает UITableView, когда аннотация выбрана, если я использовал «cellIdenfier» в качестве имени для повторного использования в обоих UITableView, но второй использовал пользовательский класс для UITableViewCell, когда я возвращаюсь к вид сверху, не будет ли система потенциально возвращать мне неправильный тип во время очереди и вызвать немного странный вывод?

Ответы [ 2 ]

3 голосов
/ 05 января 2011

Даже если вы приняли ответ, так как он неполный, я добавлю к нему.

Насколько мне известно, однозначное определение Карла касается денег.

Модель - это не только объекты, хранящие данные, но и бизнес-логика.

Что касается того, куда идет *, то да, это вопрос стиля, но неправильно сказать, что это часть типа в C (из которых Objective-C является надмножеством). Это легко продемонстрировать с помощью следующего:

int* foo, bar;

Он не объявляет две переменные типа int*, но указывает на int (foo) и int (bar). Так что технически вы должны поставить * с именем переменной. Однако я использую то же соглашение, что и Карл, и избегаю вышеуказанной проблемы, никогда не объявляя переменные в разделенных запятыми списках.

Когда использовать NSInteger вместо простого int?

Вы должны всегда использовать его в любое время, когда в документах API Какао указано, что вам следует. В остальном нет абсолютно никакого преимущества в использовании, в отличие от простого int. Если вам нужно гарантировать определенную ширину для типа int, вы должны использовать стандартные значения C99 от stdint.h (int32_t, int64_t и т. Д.). Если вам не нужно гарантировать определенную ширину, вы можете также использовать встроенные типы, за исключением случаев, когда API-интерфейс Cocoa дает вам целое число NS (U). Преобразование целого числа NS (U) в целое число (без знака) может привести к его усечению на некоторых архитектурах (например, x86_64).

Повторно используемые идентификаторы сущностей

UITableView нужен один экземпляр для каждой ячейки, которая в данный момент видна на экране. Создание ячейки может быть дорогим (например, вам может понадобиться перейти на диск для загрузки NIB), поэтому вместо того, чтобы выбрасывать ячейки, когда они выходят из поля зрения, табличное представление помещает их в очередь отброшенных ячеек. Тогда гораздо быстрее вытянуть неиспользуемую ячейку из этой очереди, когда вам нужна новая, чем создать ее с нуля.

Идентификатор повторного использования необходим, потому что в вашем табличном представлении могут быть ячейки разных типов. например одна строка может иметь текстовое поле, а другая строка может иметь средство выбора даты. Поэтому, если табличное представление запрашивает ячейку для текстовой строки, было бы нецелесообразно давать ей ячейку со средством выбора даты.

1 голос
/ 05 января 2011

Как сказала миддапарка, вам, вероятно, следует разделить вопросы, но я могу ответить на 1-3.

Синглтон - это шаблон проектирования, означающий, что во всей программе есть только один экземпляр класса. Обычно он реализуется статическим методом getInstance, который либо возвращает существующий экземпляр (сохраненный как статическая переменная), либо создает новый, если его не существует. Любая хорошая ссылка на шаблоны дизайна должна адресовать это.

Для MVC ваше представление о модели является по существу правильным. Модель - это место, где хранятся данные. Опять же, посмотрите детали шаблона проектирования для подробностей.

Что касается *, это во многом вопрос стиля, так как компилятор примет любой метод. Лично я предпочитаю ставить его рядом с типом, поскольку технически он является частью типа, но в большинстве мест, где я работал, ставится рядом с идентификатором. Я полагаю, что обоснование для помещения его рядом с идентификатором заключается в том, что одним из других способов использования * является разыменование указателя, и в этом случае имеет смысл сгруппировать его с переменной, и они хотят сделать его визуально согласованным. Я видел только пробелы вокруг * при использовании в качестве оператора умножения.

...