(假设我有充分的理由不在我的代码中删除我的NSAssert()检查,因为我也在进行单元测试.)
在我的单元测试代码中,我喜欢确保在我调用它时代码中的NSAssert命中(断言).因此,在调用执行断言的代码时,我使用STAssertThrows()宏.
问题是:尽管文档说NSAssert会抛出异常,但单元测试运行将停止,并显示错误消息,说明应用程序崩溃了.
这是模拟器中的SDK 3.1.3.
这是框架中的错误还是我可以做些什么来使这项工作更好,即NSAssert会抛出单元测试宏可以捕获的正确异常?
我正在编写一个工具,可以找到适用于Mac和Windows的iTunes资料库的丢失文件.在Mac上,我可以通过使用精彩的"CatalogSearch"功能命名来快速查找文件.
但是,在Windows上,似乎没有用于按文件名搜索的OS API(或者是否存在?).
经过一些谷歌搜索,我了解到有一些工具(如TFind,Everything)直接读取NTFS目录并扫描它以按名称查找文件.
我想做同样的事情,但不必从头开始(虽然我过去写了很多磁盘工具,但我从来没有精力去挖掘NTFS).
我想知道是否有现成的库,可能是.dll,它会给我这个搜索功能:传入一个文件名,回到它的路径.
或者,Windows索引服务怎么样?至少当我在最近安装的XP Home系统上尝试此操作时," 开始"菜单下的" 搜索"操作实际上会扫描所有目录,这表明它没有完整的数据库.由于我根本不是Windows用户,我想知道为什么这不起作用.
最后,我需要的完整解决方案是:我有一个要查找的文件名列表,我需要搜索整个磁盘的代码(或者使用数据库)来一次性获取所有结果.例如,搜索不应该为我正在查找的每个文件启动新的完整扫描.这就是为什么我认为MFT方式是最优的,因为它可以快速迭代所有名称,将每个名称与我的列表进行比较.
我正在通过NSTask
. 这些工具可能会运行几秒钟,并不断地将文本输出到stdout
. 最终,该工具将自行终止。我的应用程序使用readInBackgroundAndNotify
.
如果我在工具退出后立即停止处理异步输出,我通常会丢失一些当时尚未交付的输出。
这意味着我必须等待更长的时间,以允许 RunLoop 处理挂起的读取通知。我如何知道我何时阅读了该工具写入管道的所有内容?
这个问题可以在下面的代码中通过删除带有runMode:
调用的行来验证- 然后程序将打印零行已处理。所以看起来在进程退出时,队列中已经有一个等待传递的通知,并且传递是通过runMode:
调用发生的。
现在,看起来在工具退出后简单地调用runMode:
一次可能就足够了,但我的测试表明它不是 - 有时(具有大量输出数据),这仍然只会处理剩余数据的一部分。
注意:诸如使调用的工具输出某些文本结束标记之类的变通方法不是我寻求的解决方案。我相信必须有一些适当的方法来做到这一点,从而以某种方式发出管道流的结束信号,这就是我在答案中寻找的。
下面的代码可以粘贴到一个新的 Xcode 项目AppDelegate.m
文件中。
运行时,它调用一个工具来生成一些更长的输出,然后等待工具终止waitUntilExit
。如果它随后立即删除outputFileHandleReadCompletionObserver
,则将错过该工具的大部分输出。通过添加runMode:
持续一秒的调用,接收工具的所有输出——当然,这个定时循环不是最佳的。
而且我想保持runModal
函数同步,即它在收到工具的所有输出之前不会返回。它确实在我的实际程序中以自己的方式运行,如果这很重要(我看到 Peter Hosey 的评论警告waitUntilExit
会阻止 UI,但在我的情况下这不是问题)。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[self runTool];
}
- (void)runTool
{
// Retrieve 200 lines of text by invoking `head -n 200 /usr/share/dict/words`
NSTask *theTask = [[NSTask alloc] init];
theTask.qualityOfService …
Run Code Online (Sandbox Code Playgroud) 想象一下 macOS 上两个路径的简单示例:
/etc/hosts
/private/etc/hosts
两者都指向同一个文件。但是你如何确定呢?
另一个例子:
~/Desktop
/Users/yourname/Desktop
或者不区分大小写的文件系统上的大写/小写混合怎么样:
/Volumes/external/my file
/Volumes/External/My File
甚至这个:
/Applications/Über.app
此处:“Ü”可以用两种unicode 组合格式(NFD、NFC)指定。有关使用 (NS)URL API 时可能发生这种情况的示例,请参阅我的这个要点。
从 macOS 10.15 (Catalina) 开始,还有另外的Firmlinks从一个卷链接到卷组中的另一个。同一个 FS 对象的路径可以写成:
/Applications/Find Any File.app
/System/Volumes/Data/Applications/Find Any File.app
我喜欢记录可靠地处理所有这些复杂问题的方法,目标是高效(即快速)。
有人能指出我介绍ScriptingBridge的一个非常简单的hello world类型的应用程序吗?你需要一步一步地创建一个可以从ruby/python/applescript等实例化的1类-1方法项目.
我很难绕过创建可编写脚本的cocoa应用程序所需的内容,但却找不到任何具体的示例或教程.
我需要能够比较使用NSKeyedArchiver创建的plist文件的两个版本.特别是,它是在Xcode中为.xcdatamodeld文件创建的"元素"文件.
由于我自己没有创建此文件,因此无法重新创建其对象模型.相反,我需要了解归档包含哪些类和键控属性.
理想情况下,我想创建一个包含表示类名称及其属性名称和值的字符串的树.我假设所有这些信息都存储在存档中,因此应该可以一般地解析这个存档,对吧?
我已经阅读了有关NSKeyedUnarchiver及其代理人的信息.我只是这样:
取消归档文件数据:
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
unarchiver.delegate = self;
id graph = [unarchiver decodeObjectForKey:@"root"];
Run Code Online (Sandbox Code Playgroud)
这是在请求未知类时调用的委托方法.我在这里返回一个代理类,我希望在其中收集它的值:
- (Class)unarchiver:(NSKeyedUnarchiver *)unarchiver cannotDecodeObjectOfClassName:(NSString *)name originalClasses:(NSArray *)classNames
{
NSLog(@"wants: %@", name);
return [ObjProxy class];
}
Run Code Online (Sandbox Code Playgroud)
代理类实现
- (id)initWithCoder:(NSCoder *)aDecoder
Run Code Online (Sandbox Code Playgroud)
其中我不知道如何继续,不知道类的实际属性.NSCoder似乎没有提供任何功能来了解可用的密钥.是否有一个技巧可以通过覆盖一些较低级别的objc方法来获取它们?
到目前为止,通过上面显示的这个小代码,在解析"elements"文件时,我只获得了一个类"XDPMModel"的请求,然后就完成了.
任何想法如何使这个工作,即更深入地穿越树?
在Info.plist
我们的基于Java的应用程序中包含以下项目:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
<dict>
...
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>myApp handler</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
...
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
它应该处理像这样的URL myapp://foobar/bazz
.打开应用程序工作正常,但应用程序应如何获取单击的URL?
使用currentIndex作为NSNumber并将NSNumber保存在NSUserDefaults中。
使用currentIndex在NSUserDefaults中存储书签页面
这就是我将currentIndex保存在NSUserdefaults中的方式:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:currentIndex forKey:@"currentIndex"];
[defaults synchronize];
Run Code Online (Sandbox Code Playgroud)
如果这是将currentIndex保存在NSUserdefaults中的正确方法,那么我如何才能在NSUserdefaults中检索保存的currentIndex。
感谢帮助。
在编写归档实用程序时,我需要能够在 Mac OS X 文件系统上读取和写入资源分支。
曾经存在FSOpenFork
相关函数,但当前的在线文档和 Xcode (v7.1) 中包含的文档甚至不再提及这些函数。
此外,诸如此类的功能GetEOF
甚至不再适用于 64 位应用程序。
目前有哪些 API 可用于读写资源分支?如果可以的话,请提供打开、读取、写入、关闭和查询/设置 EOF 和当前读写偏移量的函数声明。
注意:虽然我添加了自己的答案,列出了替换 FS... 函数,但如果其他人可以添加更多方法,例如使用 CFURL API 或命名 fork 方法(使用特殊的文件名,但我一直忘记它是如何工作的)。
我试图找到两个连续行的模式,其中第一行是固定字符串,第二行有我喜欢替换的部分子字符串。
这需要在macOS 中sh
或bash
之上完成。
如果我手头有一个可以对整个文本进行操作的正则表达式工具,这对我来说会很容易。然而,我发现的只是 bash 的简单文本替换 - 它不适用于正则表达式,并且sed
是面向行的。
我怀疑我可以使用sed
一种方式,它首先找到匹配的第一行,然后只有在其模式也匹配时才查找替换下一行,但我无法弄清楚这一点。
或者 macOS 上是否有其他工具可以让我对整个文件或字符串进行基于正则表达式的搜索和替换?也许使用Python(安装了v2.7和v3)?
这是示例文本以及我喜欢的修改方式:
keyA
value:474
keyB
value:474 <-- only this shall be replaced (follows "keyB")
keyC
value:474
keyB
value:474
Run Code Online (Sandbox Code Playgroud)
现在,我想找到第一行是“keyB”而后一行是“value:474”的所有情况,然后将第二行替换为另一个值,例如“value:888”。
作为忽略行分隔符的正则表达式,我会这样写:
(\bkeyB\n\s*value):474
$1:888
所以,基本上,我找到 474 之前的模式,然后用相同的模式加上新的数字 888 替换它,从而保留原始缩进(这是可变的)。
macos ×4
cocoa ×2
filesystems ×2
bash ×1
core-data ×1
file-forks ×1
ios ×1
iphone ×1
java ×1
nsfilehandle ×1
nsnumber ×1
nspipe ×1
nstask ×1
nsurl ×1
ntfs ×1
ntfs-mft ×1
objective-c ×1
regex ×1
sed ×1
sh ×1
shell ×1
swt ×1
unit-testing ×1
windows ×1