0

私はこのコードを取得しようとしています:http ://code.google.com/p/switchcontrol/source/browse/trunk/code/AFSwitchControl.mXcode4.5.2のAppleLLVMでコンパイルしています。LLVM / GCCでコンパイルすると機能しますが、198行目でApple LLVMに切り替えると、mouseDownメソッドでクラッシュします。

NSRect knobRect = _AFSwitchControlKnobRectForInsetBackground(slotRect, _offset);

_offsetが設定されていないため。次の行を使用してbindメソッドで設定することを想定しています。

[self setOffset:(CGFloat)[self state]];

しかし、何らかの理由でLLVMの下に何も設定されていないようです。私のバインディングコールは次のようになります。

[control bind:NSValueBinding toObject:self withKeyPath:@"isToggleSwitchOn" options:nil];

コントロールの状態がLLVMで何も返さない理由はありますか?ありがとう!

4

1 に答える 1

1

問題は、実際には_AFSwitchControlPartRectsの呼び出しの数行上にあります。

- (void)mouseDown:(NSEvent *)event {
    NSRect textRect, backgroundRect;
    _AFSwitchControlPartRects([self bounds], &textRect, &backgroundRect);

    NSRect slotRect = _AFSwitchControlInsetBackgroundRect(backgroundRect);
    NSRect knobRect = _AFSwitchControlKnobRectForInsetBackground(slotRect, _offset);

_AFSwitchControlPartRectsの2番目の引数である&textRectは、rectへのポインターです。

ただし、関数の実装では、そのパラメーターは2つのrectに十分なスペースへのポインターであると想定されています。

NS_INLINE void _AFSwitchControlPartRects(NSRect bounds, NSRect *textRects, NSRect *backgroundRect) {
    NSDivideRect(bounds, textRects, backgroundRect, NSWidth(bounds)/5.0, NSMinXEdge);

    textRects[1] = _AFSwitchControlInsetTextRect(NSOffsetRect(textRects[0], NSWidth(*backgroundRect), 0));
    textRects[0] = _AFSwitchControlInsetTextRect(textRects[0]);

これがtextRects[1]に書き込むとき、-mouseDownのスタックに落書きしています。バッファオーバーフロー。

私にはそれが自己を覆い隠すために起こっているように見えるので、自己の次の間接参照は死にます。これはたまたま_offsetの使用です。

于 2013-09-22T08:05:23.207 に答える