代码之家  ›  专栏  ›  技术社区  ›  Not Rick Astley

混淆cocoa问题“程序挂起,除非存在未识别的方法调用

  •  0
  • Not Rick Astley  · 技术社区  · 15 年前

    请原谅,这件事很难解释。我希望外面的英雄知道这里发生了什么。需要一些历史;

    我的一个可可物体,球代表一个小图形。它只在视图中有意义。在Ball的一些方法中,它要求视图重新绘制。最重要的是,它要求视图在设置Ball_s position参数时重新绘制。这是在设定器中实现的。

    这里是一口,建议:

    鉴于M

    - (void)mouseUp:(NSEvent *)theEvent {
        if (![runnerPath isEmpty]) {
            [walkPath removeAllPoints];
            [walkPath appendBezierPath:runnerPath];
            [runnerPath removeAllPoints];
    
            [[self held] setStep:0];
            [[self held] setPath:walkPath];
            [NSTimer scheduledTimerWithTimeInterval:.01 target:[self held] selector:@selector(pace) userInfo:nil repeats:YES];
    
            }
    }
    

    在球上

     - (void)pace { 
        CGFloat juice = 10;
        BOOL loop = YES;
    
        while (loop) {
            if ([self step] == [[self path] elementCount]) {
                if ([[self timer] isValid]) {
                    [[self timer] invalidate];
                }
                [[self path] removeAllPoints];
    //          @throw([NSException exceptionWithName:@"test" reason:@"reason" userInfo:nil]);
            }
    
            if (loop) {
                CGFloat distance;
                NSPoint stepPoint;
    
                if ([[self path] elementCount] > 0) {
                    NSPoint returnPoints[2];
                    [[self path] elementAtIndex:[self step] associatedPoints:returnPoints];
                    stepPoint = returnPoints[0];
                    distance = pixelDistance([self position], stepPoint);
                }
    
                if (distance <= juice) {
                    [self setPosition:stepPoint];
                    if (distance < juice) {
                        juice -= distance;
                        loop = YES;
                        [self setStep:[self step]+1];
                    } else {
                        loop = NO;
                    }
                } else {            
                    NSPoint cutPoint = moveAlongBetween([self position], stepPoint, juice);
                    [self setPosition:cutPoint];
    
                    loop = NO;
                }
    
            }
        }
    
    }
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   mvds    15 年前

    你能告诉我你如何处理异常吗?因为通常无法识别的选择器将结束您的程序。也许您需要一个异常而不是一个无法识别的选择器。尝试:

    @throw([NSException exceptionWithName:@"test" reason:@"reason" userInfo:nil]);
    

    如果这也能解决这个问题,你就需要在这段代码之后做一些事情来冻结应用程序。

    编辑: 感谢您更新代码。

    这里发生了一些奇怪的事情!我不打算重写整个过程,所以这里有一些提示:

    • 首先:您正在从计时器循环调用的某个例程中循环。这是故意的吗?在这段时间内无法暂停执行 while() 循环,所以它将在一瞬间发生。你需要在课堂上保留一些状态信息。例如,每次添加循环计数器 pace 被称为。
    • 第二:如果你启动一个计时器,它会用计时器作为参数调用你的选择器。所以把函数定义为 -(void)pace:(NSTimer*)timer 及使用 timer 不是 [self timer] (如果不分配,后者也不会是您的计时器!)
    • 第三:你每秒射击100次。这是非常多的,而且可能比您为其编写本文的任何设备的刷新率都要高。我想20秒就够了。
    • 第四:当然,如果你把它改成 -(void)速度:(nstimer*)计时器 ,不要忘记使用 @selector(pace:) (也就是说,不要忘记 : )

    修复这些问题,如果问题仍然存在,请再次更新您的问题并发表评论,以便我们了解。祝你好运!

        2
  •  1
  •   Abizern    15 年前

    尝试呼叫

    for (NSView *each in [self views]) {
        ...
    }
    

    我想是的 views 是一个数组,因此快速枚举直接应用于它,不需要调用allobjects。

    其他几点。

    1. 是否设置了objc_exception_throw的全局断点?这将应用于所有Xcode项目,非常有用,我很惊讶默认情况下它没有设置。
    2. 你说你在控制台上看到了错误。那么,我认为您没有在代码上设置断点,而是单步执行代码,以查看当您的执行达到该点时到底发生了什么?看看 Xcode Debugging Guide
    推荐文章