Почему printf не может распечатать NSObject в цикле выполнения? - PullRequest
1 голос
/ 02 апреля 2019

Я делаю простое упражнение, чтобы посмотреть на кучу и стек, используя Objective-C.

Я создаю объект NSNumber в main - я предполагаю, что это указывает на кучу, верно? Когда я пытаюсь запустить printf на объекте, я получаю ошибку EXC_BAD_ACCESS.

  • NSLog работает нормально - насколько я понимаю, NSLog - это printf, но расширенный.
  • Я могу запустить printf на NSString

Раньше я запускал printf для объектов, и это не было проблемой. Что-то изменилось или я упускаю что-то очевидное?

Когда я запускаю отладчик и распечатываю объект, я получаю результат: isa

        Printing description of lifeAnswerObject:
        (NSNumber) NSNumber = {
            NSValue = {
                NSObject = {
                    isa = <read memory from 0x966d0398ef3e399b failed (0 of 8 bytes read)>

                }
            }
        }

Что это значит? Несмотря на то, что номер NSNumber включен в автозапуск, в этот момент его не следует выпускать.

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");

        NSNumber *lifeAnswerObject = [[NSNumber alloc] initWithInt: 42];
        NSString *helloWorld = @"Hello out there world";
        NSLog(@"%@ in the heap", lifeAnswerObject);
        // EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
        printf("%s", helloWorld); // survives
        printf("%s", lifeAnswerObject);
        int lifeAnswer = 42;

        printf("%d : in the stack", lifeAnswer);
    }
    return 0;
}

debugger

1 Ответ

2 голосов
/ 02 апреля 2019

Это не имеет ничего общего с помеченными указателями.

Вы не можете использовать %s для печати типов объектов. То, что оно выжило , просто случайно; В адресе объекта не было данных, которые привели к его падению.

Посмотрите на вывод printf() строки. Это мусор.

Если вы хотите использовать printf(), вам необходимо предоставить буфер char*.

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