#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 о правильных форматах.
И вы можете сделать это здесь:
Комментарии:
1.
%d
предназначен для целых значений, а не для двойных. Кроме того, безусловно, возможно зарегистрировать «объект» (технически, указатель) с%d
помощью , и в этом случае соответствующий адрес памяти форматируется как десятичное целое число. Запись указателя в виде десятичного целого числа всегда допустима, независимо от того, указывает ли указатель на допустимый объект.2. @Bavarious: Вы правы. Я исправляюсь. Все это есть в документе Apple, который: D