Objective-C (aClassName *) - PullRequest
       1

Objective-C (aClassName *)

0 голосов
/ 19 февраля 2012

Я своего рода самопрограммист, поэтому время от времени мне не хватает некоторых базовых знаний.

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

В target-c я вижу строки кода, подобные этому:

aClassName *myObject = (aClassName *)[NSEntityDescription insertNewObjectForEntityForName:@"aClassName" inManagedObjectContext:app.managedObjectContext];

Что беспокоит меня, так эточто (aClass *) часть.Что это ?

Я знаю / чувствую, что это связано с очень базовыми знаниями, но я не могу назвать их, поэтому не могу их найти.

Мое предположение (и вот как я использую его до сих пор)это то, что используется для вызова методов класса (+), но я не уверен в этом, и это может быть более глубоким, чем то, что я понимаю.

Спасибо за любое объяснение.

Ответы [ 3 ]

3 голосов
/ 19 февраля 2012

Это приведение, в данном случае приведение вниз (даже потому, что приведение вверх неявно).

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

Подумайте о следующей ситуации:

Class *a = [[Subclass alloc] init];
Subclass *b = a;

(предположим, что Subclass является подклассом Class)

Это не скомпилируется, потому что a статически определен с типом, который не содержится в подклассе. Но назначение не создаст никаких проблем динамически, потому что a используется для хранения Subclass объекта на практике.

Так что вы делаете? Вы помещаете приведение Subclass *b = (Subclass*)a;, чтобы сказать компилятору «доверяйте мне и игнорируйте проверку типов при выполнении этого назначения, я утверждаю, что оно будет действительным во время выполнения», и вы автоматически удаляете ошибку компиляции. Применение такого поведения, конечно, удаляет безопасность типов из вашего кода, поэтому вы должны знать, что вы делаете.

Конечно, чтобы понять значение приведения в этой ситуации, вы должны хотя бы знать о наследовании и объектах ..

В вашей конкретной ситуации возвращаемым типом метода +(id)insertNewObjectForEntityForName:... является id, который является наименее конкретным видом объекта в ObjectiveC, его всегда нужно привести к чему-либо, если он не хранится, как обычный id

1 голос
/ 19 февраля 2012

Это приведение типа:

double x = 5.0;
int y = (int)x;

Я не знаю, почему это происходит в вашем случае, насколько я знаю, что метод возвращает id, поэтому приведение не требуется (дажебез него предупреждение компилятора не будет генерироваться).

Относительно «где найти такую ​​информацию»: Objective-C / C ++ соответственно построен на C и C ++, поэтому я бы рекомендовал сначала изучить основы этих языков.

0 голосов
/ 19 февраля 2012

это просто означает приведение объекта к типу класса внутри скобок, например, здесь мы приводим defention UITableViewCell к CustomCell

    CustomeCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell = (CustomeCell*)[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

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

Class *obj = [Class alloc] init];
[obj funtionName];

в Классный метод Вы просто делаете это

[Class funtionName];

надеюсь, это будет полезно.

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