Терминологический вопрос о Objective-C / iOS
Извините, если это звучит немного странно, я все еще относительно новичок в 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 ответа
Как сказала миддапарка, вам, вероятно, следует разделить вопросы, но я могу ответить на 1-3.
Синглтон - это шаблон проектирования, означающий, что во всей программе есть только один экземпляр класса. Обычно это реализуется со статическим getInstance
метод, который либо возвращает существующий экземпляр (сохраненный как статическая переменная), либо создает новый, если он не существует. Любая хорошая ссылка на шаблоны дизайна должна решить эту проблему.
Для MVC ваше представление о модели является по существу правильным. Модель - это место, где хранятся данные. Опять же, посмотрите на образец шаблона дизайна для деталей.
Относительно того, куда идет *, это в значительной степени вопрос стиля, поскольку компилятор примет любой метод. Лично я предпочитаю ставить его рядом с типом, поскольку технически это часть типа, но в большинстве мест, где я работал, ставится рядом с идентификатором. Я полагаю, что обоснование для помещения его рядом с идентификатором заключается в том, что одним из других способов использования * является разыменование указателя, и в этом случае имеет смысл сгруппировать его с переменной, и они хотят сделать его визуально согласованным. Я видел только пробелы вокруг * при использовании в качестве оператора умножения.
Даже если вы приняли ответ, так как он не завершен, я добавлю к нему.
Насколько мне известно, однозначное определение Карла касается денег.
Модель - это не только объекты, хранящие данные, но и бизнес-логика.
Что касается того, куда идет *, то да, это вопрос стиля, но неправильно сказать, что это часть типа в 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) в int (без знака) может привести к его усечению на некоторых архитектурах (например, x86_64).
Повторно используемые идентификаторы объекта
UITableView нужен один экземпляр для каждой ячейки, которая в данный момент видна на экране. Создание ячейки может быть дорогим (например, вам может понадобиться перейти на диск для загрузки NIB), поэтому вместо того, чтобы выбрасывать ячейки, когда они выходят из поля зрения, табличное представление помещает их в очередь отброшенных ячеек. Гораздо быстрее вытащить неиспользуемую ячейку из этой очереди, когда вам нужна новая, чем ее создание с нуля.
Идентификатор повторного использования необходим, потому что в вашем табличном представлении могут быть ячейки разных типов. например, в одной строке может быть текстовое поле, а в другой строке может быть указатель даты. Таким образом, если табличное представление запрашивает ячейку для текстовой строки, было бы нецелесообразно давать ей ячейку со средством выбора даты.