используя * указатель в функции target-c?(2 примера) - PullRequest
1 голос
/ 03 апреля 2012

Я пытаюсь понять это в объективе-c:

в этом примере indexPath является указателем, но мы используем его «как есть» в функции: indexPath.section вместо (например) *indexPath.section*):

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return (indexPath.section == 0) ? nil : indexPath;
}

Итак, в target-c нам не нужно добавлять *, чтобы получить содержимое переменной, на которую указывает указатель ...?

но я нашел эту функцию, где они используют * на указатель внутри функции (на reverse):

NSInteger lastNameFirstNameSort(id person1, id person2, void *reverse)
{
    NSString *name1 = [person1 valueForKey:LAST];

    //...

    if (*(BOOL *)reverse == YES) {
        return 0 - comparison;
    }

и для переменных id они используют имя переменной как есть: например, здесь: person1

Итак, кто-то может объяснить мне различия между этими двумя примерами:
почему в первом примере мы не добавляем * на indexPath,
почему мы не добавляем * к id переменным, а используем его с *reverse во втором примере?

Спасибо

Ответы [ 2 ]

5 голосов
/ 03 апреля 2012

Вы путаете нотацию с чтением структуры.Это неудивительно, поскольку Apple сделала их неоднозначными.

indexPath.section не означает «элемент структуры section в indexPath. Это даже не означает» свойство section в indexPath. "Это означает [indexPath section]. Он просто вызывает метод section и возвращает результат.

Точно так же foo.bar = baz буквально не означает" установить свойство bar в baz. "Это буквально означает [foo setBar:baz]. Что бы ни делал setBar:, будет сделано. В большинстве случаев он устанавливает ивар.

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

Расстраивающая вещь овсе это то, что foo.bar может быть структурной ссылкой или вызовом метода. Не зная, что такое foo, вы не можете знать. Это одна из проблем с точечной нотацией.

Если вас смущает, не используйте точечные обозначения (ят продолжает оставаться противоречивой особенностью среди опытных разработчиков).Это никогда не требуется.Это просто сокращение для более явных [foo bar] и [foo setBar:baz].

*(BOOL *)result означает "приведение result от void* до BOOL * и разыменование его как BOOL. Этоне имеет отношения к точечной записи.

2 голосов
/ 03 апреля 2012

Dot-синтаксис на объектах ObjC (указатели на объекты) - это способ доступа к методам форм [object getter] и [object setter: value], используя java / c # / javascript-нотацию (object.property), в то время каксинтаксис не совсем согласован, объект-> свойство уже занято прямым доступом к свойству.reverse - это просто обычный указатель на void, поэтому (BOOL *) преобразует его в указатель BOOL, а символ * перед его разыменованием.типы id по-прежнему являются указателями, просто синтаксис для доступа к свойству в ObjC не согласуется с существующим синтаксисом языка Си.

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