Cocoa ApplescriptObjC调用NSMakePoint会导致exc\u bad\u访问错误
这个问题让我很困惑,因为AppleScriptObjC应该自己处理垃圾收集 无论如何,重现此错误的步骤如下: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
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中,山狮和小牛之间没有太大变化。)