Почему выделение и init называют отдельно в Objective C?

9-летний вопрос, но Google принес мне здесь в 2019 для той же проблемы

ссылка в , https://dev.mysql.com/doc/refman/8.0/en/show-tables.html говорит нам, что мы не можем использовать КАК и ГДЕ вместе (для mysql 5.5.x - 8.x).

Так этот бросок оператора WILL ошибки (показывают таблицы, которые НЕ являются представлениями и далее фильтрованы %name %);

  show full tables like "%sometablename%"  where Table_Type = 'BASE TABLE';

U должен будет выбрать LIKE или WHERE в одном операторе, не обоих одновременно.

::: Решение (требует Вас, знает, имя базы данных (скажите что dbName)):::

   show full tables where  Tables_in_dbName like "%main%" 
   and  Table_type = "Base Table";

15
задан Abizern 6 September 2009 в 18:18
поделиться

5 ответов

Предполагая, что вы используете .NET 3.5, вы можете превратить любую последовательность (например, IEnumerable ) в словарь:

var dictionary = sequence.ToDictionary(item => item.Key,
                                       item => item.Value)

где Key и Значение - это соответствующие свойства, которые вы хотите использовать как ключ и значение. Вы можете указать только одну проекцию, которая будет использоваться для ключа, если сам элемент является нужным вам значением.

Так, например, если вы хотите сопоставить версию каждой строки в верхнем регистре с оригиналом, вы можете использовать:

var dictionary = strings.ToDictionary(x => x.ToUpper());

В вашем случае, какими должны быть ключи и значения?

Если вам действительно нужен набор (который вы можете проверить, чтобы увидеть, содержит ли он конкретную строку, например ),

21
ответ дан 30 November 2019 в 23:59
поделиться

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

Для NSString у вас есть, например:

+ (id)string  // (Empty string)
+ (id)stringWithFormat:...  // Formatted string (like you use)
+ (id)stringWithContentsOfURL:... // String populated with contents of URL

И так далее. И затем вы могли бы использовать это как: NSString * myString = [NSString stringWithFormat: @ "Hello% @ \ n", userName];

Большинство других классов имеют это, например NSArray:

+ (id)array
+ (id)arrayWithContentsOfFile:...
+ (id)arrayWithContentsOfURL:...
+ (id)arrayWithObjects:...

Вам просто нужно прочтите документацию. :) И прочтите другие ответы о том, почему вы не хотите использовать это слишком много.

1
ответ дан 30 November 2019 в 23:59
поделиться

Поскольку создание экземпляра и инициализация экземпляра - это два отдельных задания.

Вы отправляете классу сообщение alloc , чтобы получить неинициализированный экземпляр. Затем вы должны инициализировать экземпляр, и у вас часто есть несколько способов сделать это. Например:

myStr = [[NSString alloc] init]; //Empty string
myStr = [[NSString alloc] initWithFormat:@"%@.%@", parentKeyPath, key];
myStr = [[NSString alloc] initWithData:utf16data encoding:NSUnicodeStringEncoding error:&error];
myStr = [[NSString alloc] initWithContentsOfURL:URL encoding:NSUTF8StringEncoding error:&error];

Каждый из них инициализирует строку совершенно по-своему. То, как вы инициализируете строку, зависит от того, из чего вы хотите ее инициализировать.

Конечно, никому не нравится писать alloc , а затем init и затем autorelease каждые времени, поэтому обычно у вас есть удобные методы (например, stringWithFormat: ), которые выполняют все три шага за вас.

Изменить: Подробнее по этой теме, включая важные идеи от комментаторов, см. в моем сообщении в блоге « Воссоединение ».

16
ответ дан 30 November 2019 в 23:59
поделиться

Не обязательно. Вы можете использовать [MyClass new] . Это похоже на ваш гипотетический метод init .

По сути, Objective-C, в котором изначально не было сборки мусора, разделяет концепции выделения памяти и инициализации класса. Вот почему есть два разных метода. Когда вы вызываете alloc , вы явно выделяете память.

6
ответ дан 30 November 2019 в 23:59
поделиться

См. NSZone .

+ alloc - это ярлык для ] + allocWithZone: , который представляет собой механизм, который Какао предоставляет для оптимизации распределения памяти.

Итак, у вас есть возможность сделать что-то вроде этого:

foo = [[NSString allocWithZone:MyZone] initWithString:@"Foo"];
foo2 = [foo copyWithZone:MyZone];

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

Для того, чтобы зонирование было эффективным, вы можете Я бы хотел, чтобы + allocWithZone: был доступен для каждого подкласса NSObject, поэтому вам нужно разделить выделение и инициализацию. Вы можете создавать и использовать любые сочетания клавиш, например + new , но для всего этого вам понадобится метод -init , который инициализирует объект, который уже был выделен.

d хотите, чтобы + allocWithZone: был доступен для каждого подкласса NSObject, поэтому вам необходимо разделить выделение и инициализацию. Вы можете создавать и использовать любые сочетания клавиш, такие как + new , но под всем этим вам понадобится метод -init , который инициализирует объект, который уже был выделен.

d хотите, чтобы + allocWithZone: был доступен для каждого подкласса NSObject, поэтому вам необходимо разделить выделение и инициализацию. Вы можете создавать и использовать любые сочетания клавиш, например + new , но для всего этого вам понадобится метод -init , который инициализирует объект, который уже был выделен.

12
ответ дан 30 November 2019 в 23:59
поделиться