0

iPhoneプロジェクトをデバッグしているときに、かなり奇妙な動作が見られます。特に、UIViewControllerの子孫のヘッダーファイルには、次のものがあります。

@interface OOGameDetailsViewController : UIViewController <OOXMLParserDelegate,OOServerDelegate>
{
    ...

    OOXMLNode *node;
    float elheights[6];

    ...
}

@property (readwrite, retain) OOXMLNode *gameNode;

...

@end

次に、コードで、この配列に値を割り当てています。

- (void)setNode:(OOXMLNode *)aNode
{
    node = aNode;
    [self updateUserDefaults];

    [background setImage:[gameNode imageFromKey:@"background"]];

    CGFloat maxw = 240.0f;

    NSString *text = [gameNode elementNodeWithKey:@"title"].value;
    CGSize sizeOfText=[text sizeWithFont:[UIFont boldSystemFontOfSize:20.0f]
                       constrainedToSize:CGSizeMake(maxw, CGFLOAT_MAX)
                           lineBreakMode:UILineBreakModeWordWrap];
    ...
    elheights[0] = 10 + sizeOfText.height;

    text = [gameNode elementNodeWithKey:@"age"].value;
    sizeOfText=[text sizeWithFont:[UIFont systemFontOfSize:16.0f]
                constrainedToSize:CGSizeMake(maxw, CGFLOAT_MAX)
                    lineBreakMode:UILineBreakModeWordWrap];
    ...
    elheights[1] = 10 + sizeOfText.height;

    ...
    elheights[2] = 10 + height;

    ...
    elheights[3] = 10 + separatorHeight;

    text = [gameNode elementNodeWithKey:@"intro"].value;
    sizeOfText=[text sizeWithFont:[UIFont boldSystemFontOfSize:14.0f]
                constrainedToSize:CGSizeMake(maxw, CGFLOAT_MAX)
                    lineBreakMode:UILineBreakModeWordWrap];
    ...
    elheights[4] = sizeOfText.height;

    ...
    elheights[5] = 20 + btnHeight;

    [mainTable reloadData];
}

アイデアは非常に単純です。6つの浮動小数点値を6要素の配列に割り当てています。インデックスは0から5です。ただし、デバッガーでこのコードをステップ実行していると、各割り当てで一貫して示されているよりもインデックス1が高い配列の要素。つまり、elheights[0] = ...実際にはこのvlaueをに割り当てelheights[1]ます。最後の割り当て(インデックス5の要素への割り当ては単に何もしません)。

私が気が狂っていないことを証明するために、デバッガーのスクリーンショットを次に示します(関連する部分の切り抜き-画像サイズを最小に保つため)。1つ目は割り当ての直前、2つ目は割り当ての直後です。

ここに画像の説明を入力してください


ここに画像の説明を入力してください

プロジェクトをクリーンアップして再起動しました。シミュレーターを閉じ、Xcodeを閉じ、再度開いて再起動しました-同じ結果です。ObjectiveCが単純なCスタイルの配列を処理する方法について何か特別なことはありますか?

よろしくお願いします、-Aleks

4

2 に答える 2

0

-O0コンパイラの並べ替え命令の結果である最適化された(つまり非)コードをステップスルーするときに、Xcodeで奇妙なデバッガの動作を経験しました。GCC_OPTIMIZATION_LEVELが期待していないものではないことを確認してみてください。

于 2012-05-23T12:42:57.817 に答える
0

XCode4は、デフォルトで新しいLLDBデバッガーを使用しますが、これはまだ完全に機能するとは限りません。(たとえば、現在のバージョンは構造アラインメント属性を認識しません)。また、あちこちにいくつかのバグがあります。

問題が発生した場合は、GDBに切り替えます(ツールバーの[スキーム] / [スキームの編集]をクリックします。2つの選択肢がある[デバッガー]ポップアップボタンがあります)。

于 2012-05-23T13:31:30.787 に答える