Значения аргументов повреждены из-за вызовов функций в Objective-C

#objective-c #function #arguments

#objective-c #функция #аргументы

Вопрос:

Итак, у меня, похоже, есть спорадическая проблема, которую до сих пор не удалось решить никаким Google-fu. В кажущихся случайными точках функции просто ломаются, и после некоторого поиска кажется, что аргументы начнут повреждаться.

Например

 Object * testObject = [[Object alloc] init];
NSLog(@"ID: %d", testObject);
[testFunction:testObject];

...

- (void) testFunction:(id)testObject
{
    NSLog(@"ID: %d", testObject);
 

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

Иногда я могу исправить проблему, добавив к функции «фиктивное значение» следующим образом:

 - (void) testFunction:(id)testObject:(int)dummy
{
 

а затем вызываем его следующим образом:

 [testFunction:testObject:1111];
 

Все мои объявления функций совпадают в файлах .h / .m, единственное, что я мог предположить, это то, что потенциально в другом месте проекта могут отсутствовать соответствующие объявления функций в файлах .h. Однако рассматриваемые функции всегда выполняются правильно. (У меня есть двойная, тройная проверка и т. Д.). Я знаю, что это не проблема сохранения / выпуска, хотя я относительно новичок в Objective-C, у меня есть это, и я также проверил его через инструменты, ищущие утечки, и, похоже, их нет. Любые мысли о том, что может вызвать это, и почему проблемы возникают после изменения, казалось бы, совершенно не связанного кода в другом месте проекта?

Комментарии:

1. Попробуйте %@ вместо %d этого в инструкциях NSLog.

2. Проблема возникает с несколькими методами? Вы пытались воспроизвести это с помощью тестового проекта? Кроме того, было бы лучше, если бы вы вставили реальный код в свой вопрос. Опубликованные вами фрагменты недопустимы и на самом деле не помогают никому диагностировать проблему.

3. Пожалуйста, не объединяйте методы и функции в objective-c, это очень разные вещи.

Ответ №1:

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

Когда вы регистрируете любой код, который вам нужно точно отформатировать, вы получите ошибки плохого доступа.

Вам действительно следует ознакомиться с документацией Apple о правильных форматах.

И вы можете сделать это здесь:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html

Комментарии:

1. %d предназначен для целых значений, а не для двойных. Кроме того, безусловно, возможно зарегистрировать «объект» (технически, указатель) с %d помощью , и в этом случае соответствующий адрес памяти форматируется как десятичное целое число. Запись указателя в виде десятичного целого числа всегда допустима, независимо от того, указывает ли указатель на допустимый объект.

2. @Bavarious: Вы правы. Я исправляюсь. Все это есть в документе Apple, который: D