小编Mic*_*sai的帖子

有没有办法在没有桥接的情况下在Swift中使用Foundation对象(NSString,NSArray,NSDictionary)?

使用Swift时,Cocoa框架被声明为返回本机Swift类型,即使框架实际上返回了Objective-C对象.同样,这些方法将Swift类型作为参数,这是有意义的.

假设我想调用一个Cocoa方法(在Objective-C中)会给我一个NSArray,然后将它传递给一个需要的Cocoa方法NSArray.使用这样的代码:

let a: [AnyObject] = [] // Imagine calling a method that returns a huge NSArray.
let mutable = NSMutableArray()
mutable.addObjectsFromArray(a)
Run Code Online (Sandbox Code Playgroud)

看起来巨大NSArray的东西将被分配到Swift数组a,然后NSArray在作为参数传递时桥接回一个Swift数组.至少这是从剖析和看反汇编看起来的样子.

当我不需要在Swift中实际使用数组时,有没有办法避免这些可能很慢的转换?当我刚从Cocoa接收它然后将它传回Cocoa时?

起初,我认为有助于添加类型信息a:

let a: NSArray = [] // Imagine calling a method that returns a huge NSArray.
let mutable = NSMutableArray()
mutable.addObjectsFromArray(a as [AnyObject])
Run Code Online (Sandbox Code Playgroud)

但是后来我必须将参数转换为Swift数组,否则编译器会抱怨.

此外,代码的反汇编如:

let c: NSArray = mutable.subarrayWithRange(NSMakeRange(0, 50))
Run Code Online (Sandbox Code Playgroud)

显示调用__TF10Foundation22_convertNSArrayToArrayurFGSqCSo7NSArray_GSaq____TFer10FoundationSa19_bridgeToObjectiveCurfGSaq__FT_CSo7NSArray,似乎将返回值转换为Swift,然后返回到Objective-C.(即使使用Release版本也会发生这种情况.)我希望通过键入来完成,c因为NSArray不需要桥接.

我担心这会导致非常大的数据结构效率低下,许多不同的常规转换,以及懒惰/代理的集合,因为它们不一定很大但计算起来可能很昂贵.能够从Objective-C代码接收这样的数组并将其传递回去而不必实现数组的所有元素(如果它们永远不会从Swift访问)那将是很好的.

这是一个非常 …

macos cocoa swift

18
推荐指数
1
解决办法
858
查看次数

在代码编辑器中禁用Xcode抗锯齿文本?

使用Xcode时,似乎没有办法将代码编辑器字体设置为锐利(即没有'字体平滑).尽管您可能会在"首选项">"字体和颜色"的预览区域中看到,但在实际代码视图中,它始终是平滑/消除锯齿的.

有些 问题可以解决以前版本的Xcode问题.他们建议使用改变各种设置defaults write com.apple.dt.Xcode <etc>,但这些似乎不会影响我在Mac OS X 10.8.5上的Xcode 5中的代码视图.我正在使用带有一个Retina和一个非Retina屏幕的双显示器设置.

我已经尝试关闭系统首选项>常规>"使用LCD字体平滑可用"中的字体平滑复选框,但这仅影响子像素渲染...

更新(2014-11-25):Mac OS X 10.10.1和Xcode 6.1.1仍然存在问题.以下是使用这些终端命令后显示编辑器视图(平滑)和首选项窗口(未平滑)的屏幕截图:

defaults write com.apple.dt.Xcode NSFontDefaultScreenFontSubstitutionEnabled -bool YES
defaults write com.apple.dt.Xcode AppleAntiAliasingThreshold 16
Run Code Online (Sandbox Code Playgroud)

Xcode中

xcode fonts xcode5 xcode6

13
推荐指数
3
解决办法
4488
查看次数

如何通过AppleScript更改主显示屏?

在"系统偏好设置"的"显示"窗格中,我可以通过将菜单栏从一个显示拖动到另一个显示来手动更改主监视器.我想将其自动化并使其成为AppleScript的一部分.

applescript

8
推荐指数
2
解决办法
3569
查看次数

对PyObjC应用程序进行采样/配置文件的最佳方法是什么?

使用Activity Monitor/Instruments/Shark进行采样将显示Python解释器中充满C函数的堆栈跟踪.我会帮助您查看相应的Python符号名称.是否有一些可以做到这一点的DTrace魔法?Python的cProfile模块可用于分析Python调用的各个子树,但不是用于了解整个应用程序响应用户事件的情况.

python macos cocoa pyobjc

6
推荐指数
1
解决办法
324
查看次数

+ [NSURL fileURLWithPath:isDirectory:]的isDirectory参数是否正确?

我长期以来一直在使用+[NSURL fileURLWithPath:]它,因为它很方便,但是在分析中发现这是瓶颈的根源,因为它在调用+[NSURL fileURLWithPath:isDirectory:](或与Core Foundation等效)之前查询文件系统:

如果此方法path以斜杠结尾,则假定它是目录。如果path不以斜杠结尾,则该方法检查文件系统以确定path是文件还是目录。如果path文件系统中存在一个目录,并且该目录是目录,则该方法将附加一个斜杠。如果path文件系统中不存在该方法,则该方法假定它表示一个文件,并且不附加斜杠。

如果可能,我想避免这种开销。但是我并不总是提前知道我正在构建的URL是否是目录。例如,可以给我一个路径,或者给我一个目录以及其中的项目名称(未知类型)。我的问题是,是否确定总是传递NOisDirectory,即使这可能会变成不准确?

特别是,我想确保这不会弄乱-[NSURL getResourceValue:forKey:error:]NSFileManager

一些基本测试并未揭示此优化有任何不良后果,但这并不意味着没有任何不良后果。我尚不清楚为什么 首先NSURL在意isDirectory。查看CFURL 源代码,该代码似乎试图确保目录路径始终以斜杠结尾。但是,除了出于显示目的,我不清楚为什么这对文件系统路径很重要。(当NSString用于表示路径时,这从来不是问题。)的文档+[NSURL fileURLWithPath:isDirectory:]isDir

一个布尔值,它指定path在解决相对路径组件时是否将其视为目录路径。YES如果路径指示目录,NO则通过;否则,请通过。

的确,如果我使用-[NSURL initWithString:relativeToURL:]baseURL除非使用YESfor 创建新的URL,否则新URL不包括它的最后一个组成部分isDirectory。但是,我认为我从未调用过这种方法,并且似乎系统不需要代表我这样做(对于上述用例)。我注意到,-[NSURL URLByAppendingPathComponent:] 如有必要,请插入斜杠,而不是假设该IS_DIRECTORY标志正确。因此,除了创建相对URL外,此标志还重要吗?即使我愿意,在一般情况下似乎也始终无法传递正确的值。文件系统总是可以从我下面变出来。如果我使用该系统,系统也永远无法确定它,+[NSURL fileURLWithPath:]因为该路径可能尚未在文件系统中存在。

macos cocoa nsurl filepath nsfilemanager

6
推荐指数
1
解决办法
956
查看次数

为什么 NSFetchRequest.shouldRefreshRefetchedObjects 不起作用?

我正在尝试在一个上下文中更新和保存托管对象,然后在另一个上下文中访问更新的属性值。的文档shouldRefreshRefetchedObjects

默认情况下,当您获取对象时,它们会保持其当前属性值,即使持久存储中的值已更改。使用参数 YES 调用此方法意味着在执行提取时,将使用持久存储中的当前值更新所提取对象的属性值。与依次对多个对象使用 refreshObject:mergeChanges: (NSManagedObjetContext) 相比,这是确保托管对象属性值与存储一致的更方便的方法。

所以我认为通过将其设置为true我可以在重新获取后获取当前值,而无需手动刷新单个对象。然而,情况似乎并非如此。在 macOS 10.14.5 上,获取请求将根据存储中的属性值选择合适的对象,但内存中的对象仍然具有陈旧的值。

下面是一些示例代码来说明问题。我希望它打印Old New New,但它打印Old Old New

import Foundation
import CoreData

class Entity: NSManagedObject {
    @NSManaged var attribute: String
}

let attribute = NSAttributeDescription()
attribute.name = "attribute"
attribute.attributeType = .stringAttributeType
let entityDescription = NSEntityDescription()
entityDescription.name = "Entity"
entityDescription.properties = [attribute]
entityDescription.managedObjectClassName = Entity.className()
let model = NSManagedObjectModel()
model.entities = [entityDescription]

let coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
try! coordinator.addPersistentStore(ofType: NSInMemoryStoreType, configurationName: nil, at: nil, …
Run Code Online (Sandbox Code Playgroud)

macos core-data macos-mojave

6
推荐指数
1
解决办法
261
查看次数

如何判断文件或文件夹是否繁忙,例如Finder是否忙于复制到文件或文件夹?

我试过了:

  1. 检查FSCatalogInfo nodeFlags是否kFSNodeForkOpenBit已设置(使用kFSNodeForkOpenMask).

  2. 检查创建者代码是否在kFirstMagicBusyFiletype和之间kLastMagicBusyFiletype.

  3. 检查ExtendedFileInfo extendedFinderFlags是否kExtendedFlagObjectIsBusy已设置.

  4. GetFileInfo -ab从shell 运行.

所有这些都报告Finder正在复制的文件打开.

使用lsof确实检测到文件是打开的,但是(a)我不想lsof从我的应用程序调用,(b)我的理解是它依赖于私有API,所以查看它的源代码无济于事.

macos

5
推荐指数
1
解决办法
5435
查看次数