Xcodeで見栄えするコメントを挿入してくれることで便利なプラグインVVDocumenterSettingがクラッシュしました。
事象はコメント自動挿入時(///と入力した時)、何も言わずにXcodeごとクラッシュするという。。(クラッシュログを記事一番最後に載せています)
ソースを追ってみると、SDKが古かったことが根本原因と分かりました。
環境は下記で、
Xcode:6.1
MacOSのバージョンが10.9(Mavericks)
クラッシュしたのは「VVDocumenterSetting.m」の
「-(NSInteger) keyVCodet;」にある
「localizedCaseInsensitiveContainsString」
というNSStringのメンバメソッド。
これがMacOSのバージョン10.10(MacOSX Yosemite)からしか対応していないのに、自分の環境が10.9だったためSDKが古く、メソッドが見つからなかったみたいです。
なので、下記のようにメソッドをコメント化して対応しました。
-(NSInteger) keyVCode
{
// TISInputSourceRef inputSource = TISCopyCurrentKeyboardLayoutInputSource();
// NSString *layoutID = (__bridge NSString *)TISGetInputSourceProperty(inputSource, kTISPropertyInputSourceID);
// CFRelease(inputSource);
//
// // Possible dvorak layout SourceIDs:
// // com.apple.keylayout.Dvorak (System Qwerty)
// // But exclude:
// // com.apple.keylayout.DVORAK-QWERTYCMD (System Qwerty ⌘)
// // org.unknown.keylayout.DvorakImproved-Qwerty⌘ (http://www.macupdate.com/app/mac/24137/dvorak-improved-keyboard-layout)
// if ([layoutID localizedCaseInsensitiveContainsString:@"dvorak"] &&
// ![layoutID localizedCaseInsensitiveContainsString:@"qwerty"]) {
// return kVK_ANSI_Period;
// }
//
// // Possible workman layout SourceIDs (https://github.com/ojbucao/Workman):
// // org.sil.ukelele.keyboardlayout.workman.workman
// // org.sil.ukelele.keyboardlayout.workman.workmanextended
// // org.sil.ukelele.keyboardlayout.workman.workman-io
// // org.sil.ukelele.keyboardlayout.workman.workman-p
// // org.sil.ukelele.keyboardlayout.workman.workman-pextended
// // org.sil.ukelele.keyboardlayout.workman.workman-dead
// if ([layoutID localizedCaseInsensitiveContainsString:@"workman"]) {
// return kVK_ANSI_B;
// }
return kVK_ANSI_V;
}
やっていることはキーボード配列を取得 → ペースト(cmd+V)のキーコードを取得
としたいようです。
自分はMacBook Pro単体でしかXcodeを使用しないので、キーボード配列がコロコロ変わることはありません。ベタ書きでも構いません。なのでreturn kVK_ANSI_V;だけ残す対処にしました
このプラグイン、コメント文の挿入のために、クリップボードを経由していることがわかりました。
また根本対処としてはXcodeの新しいバージョンをインストールするほうが正解だと思います。
Process: Xcode [33105]
Path: /Applications/Xcode.app/Contents/MacOS/Xcode
Identifier: com.apple.dt.Xcode
Version: 6.1 (6604)
Build Info: IDEFrameworks-6604000000000000~2
App Item ID: 497799835
App External ID: 752282650
Code Type: X86-64 (Native)
Parent Process: launchd [281]
Responsible: Xcode [33105]
User ID: 501
Date/Time: 2016-02-27 19:23:14.839 +0900
OS Version: Mac OS X 10.9.4 (13E28)
Report Version: 11
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Application Specific Information:
ProductBuildVersion: 6A1052d
UNCAUGHT EXCEPTION (NSInvalidArgumentException): -[__NSCFString localizedCaseInsensitiveContainsString:]: unrecognized selector sent to instance 0x7fb8169ddd10
UserInfo: (null)
Hints: None
Backtrace:
0 0x00007fff950cc244 __exceptionPreprocess (in CoreFoundation)
1 0x000000010e5b82f4 DVTFailureHintExceptionPreprocessor (in DVTFoundation)
2 0x00007fff939cae75 objc_exception_throw (in libobjc.A.dylib)
3 0x00007fff950cf12d -[NSObject(NSObject) doesNotRecognizeSelector:] (in CoreFoundation)
4 0x00007fff9502a272 ___forwarding___ (in CoreFoundation)
5 0x00007fff95029df8 _CF_forwarding_prep_0 (in CoreFoundation)
6 0x000000011d7d7ab9 -[VVDocumenterSetting keyVCode] (in VVDocumenter-Xcode)
7 0x000000011d7c9b56 -[VVDocumenterManager textStorageDidChange:] (in VVDocumenter-Xcode)
8 0x00007fff9509ae0c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ (in CoreFoundation)
9 0x00007fff94f8e82d _CFXNotificationPost (in CoreFoundation)
10 0x00007fff9454f7ba -[NSNotificationCenter postNotificationName:object:userInfo:] (in Foundation)
11 0x000000010e598d1e -[NSNotificationCenter(DVTNSNotificationCenterAdditions) _dvt_postNotificationName:object:userInfo:] (in DVTFoundation)
12 0x00007fff8f49a1b4 -[NSTextView(NSSharing) didChangeText] (in AppKit)
13 0x000000010ea618bc -[DVTSourceTextView didChangeText] (in DVTKit)
14 0x00007fff8f4972c2 -[NSTextView insertText:replacementRange:] (in AppKit)
15 0x000000010ea61529 -[DVTCompletingTextView insertText:replacementRange:] (in DVTKit)
16 0x00007fff8f4cc177 -[NSTextView insertText:] (in AppKit)
17 0x000000010ea60de7 -[DVTSourceTextView insertText:] (in DVTKit)
18 0x00007fff8f4966c7 -[NSTextInputContext insertText:replacementRange:] (in AppKit)
19 0x00007fff8f495978 -[NSTextInputContext handleTSMEvent:] (in AppKit)
20 0x00007fff8f493905 _NSTSMEventHandler (in AppKit)
21 0x00007fff94c4f1d4 DispatchEventToHandlers(EventTargetRec*, OpaqueEventRef*, HandlerCallRec*) (in HIToolbox)
22 0x00007fff94c4e787 SendEventToEventTargetInternal(OpaqueEventRef*, OpaqueEventTargetRef*, HandlerCallRec*) (in HIToolbox)
23 0x00007fff94c62880 SendEventToEventTarget (in HIToolbox)
24 0x00007fff94ca3d0d SendTSMEvent (in HIToolbox)
25 0x00007fff94ca389b SendUnicodeTextAEToUnicodeDoc (in HIToolbox)
26 0x00007fff94ca3595 TSMKeyEvent (in HIToolbox)
27 0x00007fff94c902b7 TSMProcessRawKeyEvent (in HIToolbox)
28 0x00007fff8f493150 -[NSTextInputContext handleEvent:] (in AppKit)
29 0x00007fff8f4729dd -[NSView interpretKeyEvents:] (in AppKit)
30 0x00007fff8f492d6d -[NSTextView keyDown:] (in AppKit)
31 0x00007fff8f43f56b -[NSWindow sendEvent:] (in AppKit)
32 0x000000010f81a54b -[IDEWorkspaceWindow sendEvent:] (in IDEKit)
33 0x00007fff8f3e0b32 -[NSApplication sendEvent:] (in AppKit)
34 0x000000010f5c37f4 -[IDEApplication sendEvent:] (in IDEKit)
35 0x00007fff8f2309f9 -[NSApplication run] (in AppKit)
36 0x00007fff8f21b783 NSApplicationMain (in AppKit)
37 0x00007fff89ee25fd start (in libdyld.dylib)
38 0x0000000000000001