Объявления переменных внутри метода, вызывающие вывод мусора в GDB перед его созданием - PullRequest
0 голосов
/ 12 декабря 2010

Это действительно странный вопрос, и мне интересно, нужно ли мне немного изменить свой стиль кодирования или если у меня глючит gdb.

Структура одного из моих методов выглядит следующим образом:

{
    // code that checks if this method needs to do something
    // ...

    // further down, I instantiate e.g. foo as an NSArray
    NSArray *foo = bar;
    // ...
}

Если я отлаживаю приведенный выше код, я получаю NSDictionary, называемый размерами.Поскольку я инстанцирую некоторые строки в методе foo, я получаю эти ошибки в консоли вплоть до создания foo:

-[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x541cb90

Причина, по которой это происходит, заключается в том, что и size, и foo указывают ната же память 0x541cb90 .Но так как я еще даже не СОЗДАЛ foo, я ничего не могу поделать.Ошибка появляется неоднократно, пока я не ступаю в точку foo = bar, где она перестает появляться.Причина, по которой он появляется, заключается в том, что я пытаюсь показать его значения в окне переменных отладки справа.

Это может быть связано с libXcodeDebuggerSupport.dylib отсутствует в SDK для разработки под iOS 4.2.1

Является ли просто плохой практикой объявлять переменные "на всем протяжении" такого метода?Было бы расточительно объявлять каждую переменную, которую я когда-либо намереваюсь использовать, внутри метода в самом верху, но, возможно, мне придется ...?

1 Ответ

1 голос
/ 12 декабря 2010

Я не сталкивался с этой конкретной проблемой, но я склонен к тому, чтобы лучше всего объявлять переменные как можно ближе к месту их использования - точно так же, как вы.

Каксвоего рода проверка отношения Apple, я вошел в iOS Developer Center и взял - наугад - примеры проектов кода avTouch, GLSprite и AccelerometerGraph.

Из них avTouch однозначно объявляет переменные mid-method в строках171, 183 и 188 из avTouchController.mm.Есть также пара, объявленная в верхней части блока (в старомодном смысле, а не в смысле GCD).

GLSprite содержит объявления промежуточных методов в строках 107 и 108 EAGLView.m.

AccelerometerGraph содержит аналогичные объявления в строках 257, 332 и 516 GraphView.m, а также множество других примеров переменных в верхней части блока.

Ни в одном из проектов я не видел появившуюся переменнуюбыть искусственно перенесенным на вершину метода.

Так что я склонен думать, что Apple согласна и с тобой, и со мной.Это всего лишь графический интерфейс XCode для бесполезной GDB.

...