0

我正在尝试获取此代码:http ://code.google.com/p/switchcontrol/source/browse/trunk/code/AFSwitchControl.m在 Xcode 4.5.2 中的 Apple LLVM 下编译。它在使用 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 的第二个参数,&textRect 是一个指向矩形的指针。

然而,在函数的实现中,该参数应该是指向两个矩形的足够空间的指针。

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 的堆栈上涂鸦。缓冲区溢出。

在我看来,它正在发生在破坏 self 上,所以下一次对 self 的取消引用将会消失。这恰好是_offset的使用。

于 2013-09-22T08:05:23.207 回答