【问题标题】:NSImage release() in AppleScriptObjCAppleScriptObjC 中的 NSImage release()
【发布时间】:2016-07-07 21:26:00
【问题描述】:

我正在创建一个表格视图,每行都显示小图像。 data source 为表格的每一行保存一个图像。我通过set img to NSImage()'s alloc()'s initWithContentsOfFile_(thePath) 创建图像。接下来,我通过set imageView's image to img 在更大的浏览器视图中显示所选行的图像。问题是我的内存不足,因为我对两个视图都使用了相同的表示。 (图像约为 500x400)。 我试图弄清楚如何从更大的版本制作更小的版本,然后发布更大的图像。

我从发布图像开始.. 我试过img's release(),但没用。除了Garbage Collection, ARC, and managing memory,我找不到关于该主题的任何信息。我在XCode 中打开了Objective-C Automatic Reference Counting,但它可能不适用于Applescript 交易的一部分。有没有办法在纯 ApplescriptObjC 中实现它?

【问题讨论】:

    标签: memory-management release nsimage applescript-objc


    【解决方案1】:

    试试这个代码(调整你的变量名和 UI 控件属性):

    set curImage to current application's NSImage's alloc()'s initWithContentsOfFile:thePath
    
    -- create a smaller image
    
    set newImage to current application's NSImage's alloc()'s initWithSize:{48, 48}
    
    newImage's lockFocus()
    
    curImage's drawInRect:{{0,0}, {48, 48}} fromRect:{{0,0},{0,0}} operation:2 fraction:1.0
    
    newImage's unlockFocus()
    
    imgArtwork's setImage:newImage 
    
    set curImage to missing value -- release large image
    

    【讨论】:

    • @otakon,上面调整图像大小的代码改编自我用来创建拖放反馈图像的代码。 imgArtwork 是 UI 中 Image Well 控件的属性。
    • 感谢您提供此代码,它有效!现在,我需要测试set img to missing value 从长远来看是否会释放内存。谢谢罗恩!我不使用current application's NSImage's .. 这种方法在内存方面与property NSImage : class "NSImage" 有什么不同吗?
    • @otakon 谢谢,由于代码有效,请接受上面的答案。在 ASObjC 中有几种方法可以执行语法,它们(通常)给出相同的结果,所以选择你喜欢的样式。
    • 谢谢罗恩,+1!我仍然有一些内存问题,set img to missing value 不会释放图像占用的内存。当我导入图像时,我会执行您为每张图像发布的例程。消耗内存的跳跃量与导入图像文件的总重量相同。转换成小版本后应该会释放这两个版本之间的内存差异吧?
    • 当且仅当引用计数为零时,才会释放带有 ARC 的 Objective-C 代码使用的内存。如果您没有在表格行或其他地方保留对它的引用,它应该自动释放。但是,由于您也在使用 AppleScript,因此 可能 没有像在纯 ObjC 中那样处理内存。我不知道这一点,但我已经看到并且其他人报告了 AppleScript 中奇怪的内存问题。
    猜你喜欢
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    相关资源
    最近更新 更多