Я делаю простое упражнение, чтобы посмотреть на кучу и стек, используя 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;
}