ものすごくありふれた「レコードをリストに入れたデータ」を高速でソートするために用いているサブルーチン「sortRecListByLabel」がmacOS 11でクラッシュするという情報を得て、調査してみたところたしかに100%クラッシュすることを確認しました。
具体的にどこでクラッシュするとかいえば、NSSortDescriptorでNSArrayを作る箇所、
set sortDesc to NSSortDescriptor's alloc()'s initWithKey:bLabelStr ascending:ascendF set sortDescArray to NSArray's arrayWithObjects:sortDesc--This line cause crash!!!
ここです。
クラッシュを回避するためには、明示的にNSSortDescriptorでNSArrayを作成せず、Scripting Bridge経由で暗黙のlist→NSArray変換が行われるように書き換えること。こうすればクラッシュは発生しませんでした。
→ 訂正:もともとarrayWithObjectsでNSArrayを作る際には末尾にnull(missing value)が必要になるなど、昨今ではあまり使うことが推奨されない(廃止されつつある)やり方でした。NSArray arrayWithArray:などで作ればとくに問題ないことが発覚。よく見ると、ASOC初期の古いコードでそういうやり方をしていたものがあったようです。これまで「たまたま動いていた」というのが真相のようで、、、、(Thanks Shane!)
AppleScript名:asoc_レコードのリストをソート v3 |
— Created 2021-06-24 by Takaaki Naganoya — 2021 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" script orig property aList : {} end script set (aList of orig) to {} using terms from scripting additions repeat 100 times –乱数発生にrandom numberをmacOS 11+M1 Macで呼び出すと遅いので注意 set the end of aList of orig to {labelA:"a", labelB:(random number from 1 to 100)} end repeat end using terms from set bList to sortRecListByLabel((aList of orig), "labelB", false) of me –昇順ソート return bList –リストに入れたレコードを、指定の属性ラベルの値でソート on sortRecListByLabel(aRecList as list, aLabelStr as string, ascendF as boolean) set aArray to current application’s NSArray’s arrayWithArray:aRecList set sortDesc to current application’s NSSortDescriptor’s alloc()’s initWithKey:aLabelStr ascending:ascendF –set sortDescArray to current application’s NSArray’s arrayWithObjects:sortDesc–macOS 11でクラッシュ set sortedArray to aArray’s sortedArrayUsingDescriptors:{sortDesc} set bList to (sortedArray) as anything return bList end sortRecListByLabel |
More from my site
(Visited 111 times, 1 visits today)