Cocoa ApplescriptObjC调用NSMakePoint会导致exc\u bad\u访问错误

Cocoa ApplescriptObjC调用NSMakePoint会导致exc\u bad\u访问错误,cocoa,applescript,exc-bad-access,applescript-objc,Cocoa,Applescript,Exc Bad Access,Applescript Objc,这个问题让我很困惑,因为AppleScriptObjC应该自己处理垃圾收集 无论如何,重现此错误的步骤如下: 创建新的Cocoa AppleScript应用程序项目 在项目的nameAppDelegate.applescript文件中的任意位置插入对NSMakePoint的单个调用。该文件现在应该如下所示: script testAppDelegate property parent : class "NSObject" on applicationWillFinishLaun

这个问题让我很困惑,因为AppleScriptObjC应该自己处理垃圾收集

无论如何,重现此错误的步骤如下:

  • 创建新的Cocoa AppleScript应用程序项目
  • 在项目的
    nameAppDelegate.applescript
    文件中的任意位置插入对
    NSMakePoint
    的单个调用。该文件现在应该如下所示:

    script testAppDelegate
        property parent : class "NSObject"
    
        on applicationWillFinishLaunching_(aNotification)
            -- Insert code here to initialize your application before any files are opened 
            set single_point to NSMakePoint(5, 10) of current application
            display alert "X-value of point: " & x of single_point
        end applicationWillFinishLaunching_
    
        on applicationShouldTerminate_(sender)
            -- Insert code here to do any housekeeping before your application quits 
            display alert "Terminating"
            return current application's NSTerminateNow
        end applicationShouldTerminate_ 
    end script 
    
  • 运行应用程序
  • 上述应用程序将启动并显示警报
    “点的X值:5.0”
    (如预期),但警报后,它将立即崩溃,文件
    main.m
    中出现以下
    EXC\u BAD\u ACCESS
    错误:

    因此,在某个地方调用了一个不再存在的对象。如果我们在启用了
    NSZombies
    的情况下评测应用程序,它将确认已发送了一条zombie消息,并提供以下附加信息:

    我还用
    NSMakeRange
    NSMakeRect
    尝试了同样的方法,结果完全相同。我怀疑每次调用核心基础函数都会以这样的方式破坏应用程序。但是,如果我们以调用NSTextField的stringValue()为例,它就可以正常工作

    将调用放在应用程序WillFinishLaunching的外部也无法解决此问题。那么我做错了什么

    我正在OSX Lion 1.7.4上使用XCode 4.3.3



    EDIT:经过进一步的研究,我意识到我不需要调用
    NSMakePoint
    ,我只需要创建一个AppleScript记录,如
    {x |:0,| y |:0}
    ,它的工作方式就像NSPoint对象一样。我想这就解决了。

    不可否认,我不知道也不使用AppleScriptObjC。但是,我可以看到NSPoint、NSRange和NSRect都有一些共同之处。它们不是objective-c指针对象。它们是c结构。这可能是问题所在,因为它们都失败了。您可能试图为它们释放内存,但它们不是需要释放内存指针的对象。也许AppleScriptObjC只能处理指针和对象?这也解释了为什么NSString方法可以工作,因为它是一个对象。如果你在Lion上,那么AppleScriptObjC应用程序必须在启用Objective-C垃圾收集的情况下构建。然而,根据定义,Obj-C GC使僵尸对象变得不可能-如果您收到僵尸警告,这表明您已禁用它,这肯定会造成您所看到的那种麻烦,所以请检查您的构建设置。针对Mountain Lion(10.8)或更高版本的AppleScriptObjC应用程序可能是在Obj-C GC关闭的情况下构建的,您的代码可以正常工作。(嗯,可能吧。我实际上在小牛(10.9)上验证了这一点,但在AppleScriptObjC中,山狮和小牛之间没有太大变化。)