NSLog (@ "% @", супер) сбой - PullRequest
2 голосов
/ 27 мая 2010

Я использовал NSLog (@ "% @", super) в методе ( любой метод ), и он падает .... Почему?Как распечатать супер содержимое?

Обновлено:

currentclassname : superClassName
{
}

, а также, если я использую NSLog (@ "% @", [super description]);Он печатает "<currentclassname: 0x3db7230>" вместо superClassName ... Ожидается, что superClassName будет печататься правильно.

Заранее спасибо,

Ответы [ 5 ]

5 голосов
/ 27 мая 2010

При обнаружении ключевого слова super и вызове метода для него компилятор генерирует другой вызов - objc_msgSendSuper*() вместо обычного objc_msgSend*().

objc_msgSendSuper*() вызовы получают аргумент типа objc_super* вместо objc_object*:

struct objc_super {
   id receiver;
   Class class;
};

Таким образом, значения objc_super* не являются специальными экземплярами, их необходимо использовать со специальными функциями objc_msgSendSuper*().

Таким образом, как говорит Алекс, просто вызовите -description непосредственно для super - его значение не имеет смысла вне контекста, в котором оно находится, если только вы специально не используете его с функцией времени выполнения, например objc_msgSendSuper().

3 голосов
/ 27 мая 2010

Использование -description, например ::

NSLog(@"%@", [super description]);

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

1 голос
/ 27 мая 2010

а также, если я использую NSLog (@ "% @", [супер описание]); Он печатает <currentclassname: 0x3db7230> вместо superClassName ... Ожидается, что superClassName будет печататься правильно.

Нет. Использование [super aMethod] вместо [self aMethod] просто дает вам реализацию -aMethod, которую суперкласс использовал бы, если бы он не был переопределен. [self className] и [super className] оба разрешают реализацию NSObject, которая (я думаю) опрашивает переменную экземпляра isa объекта, чтобы получить имя.

1 голос
/ 27 мая 2010

super - это способ отправить сообщение самому себе и вызвать реализацию суперкласса, а не свою собственную. Это не отдельный объект.

NSLog принимает объект в качестве параметра для %@, и объект, который вы намереваетесь передать, это вы сами.

Честно говоря, я удивлен, что рассматриваемый код даже компилируется.

Если вы хотите записать описание своего суперкласса, а не свое собственное, то, как говорит Алекс Рейнольдс, вы должны использовать сообщение [super description] для параметра NSLog. Это отправляет вам сообщение description с использованием реализации вашего суперкласса и передает объект, который возвращает это сообщение (объект NSString, который является описанием вашего суперкласса) в качестве параметра, в NSLog.

Но это, вероятно, не обязательно. Если вы переопределили description, эта реализация может отправить [super description] и интегрировать эту строку * в строку описания, которую она создает и возвращает. Если вы не переопределили description, то сообщение description к self все равно попадет в реализацию суперкласса. В любом случае, передайте self, а не super, на свои NSLog заявления.

* Существует несколько способов интеграции одной строки в другую; см. документацию NSString для получения более подробной информации.

0 голосов
/ 27 мая 2010

Попробуйте NSLog(@"%@",[super view]); или что-то вроде [super ANY_METHOD]; Чего именно ты хочешь добиться от супер?

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