Swiftのカスタムアクセサについてthis excellent articleを読んだ後、NSDecimalNumber
からリファクタリングして新しいDecimal
タイプを使用しました。私はかなり複雑なモデルを持っていて、数日間はうまくいきましたが、管理対象オブジェクトのコンテキストを保存するとEXC_BAD_ACCESS
クラッシュが表示されますが、必要な(非オプションの)プロパティは030です。 NSDecimalNumber
を直接使用する場合、リファクタの前にオブジェクトを保存すると失敗しますが、クラッシュしません。コアデータなしでコンテキストを保存するときにカスタムアクセッサがクラッシュする
わからない、これは重要ですが、私は魔法録音の機能を使用して、コンテキストを保存していた場合:NSManagedObjectContext.mr_default().mr_saveToPersistentStoreAndWait()
私は同じことを達成するためにbaseAmount
アクセサを変更する方法上の任意のアイデア失敗した保存コアデータが提供する行動をそれはクラッシュしないように?ここで
は、スタックトレースに続いて、私のNSManagedObjectのサブクラスの関連部分、である:私は言及記事で
extension DFTransaction {
@NSManaged private var primitiveBaseAmount: NSDecimalNumber
var baseAmount: Decimal {
get {
willAccessValue(forKey: "baseAmount")
defer { didAccessValue(forKey: "baseAmount") }
return primitiveBaseAmount.decimalValue
}
set {
willChangeValue(forKey: "baseAmount")
defer { didChangeValue(forKey: "baseAmount") }
primitiveBaseAmount = NSDecimalNumber(decimal: newValue)
}
}
}
[appname]`@objc DFTransaction.baseAmount.getter:
0x100343cd0 <+0>: stp x29, x30, [sp, #-16]!
0x100343cd4 <+4>: mov x29, sp
0x100343cd8 <+8>: sub sp, sp, #96 ; =96
0x100343cdc <+12>: stur x0, [x29, #-32]
0x100343ce0 <+16>: stur x8, [x29, #-40]
0x100343ce4 <+20>: bl 0x10051ca64 ; symbol stub for: objc_retain
0x100343ce8 <+24>: sub x8, x29, #24 ; =24
0x100343cec <+28>: ldur x30, [x29, #-32]
0x100343cf0 <+32>: str x0, [sp, #48]
0x100343cf4 <+36>: mov x0, x30
0x100343cf8 <+40>: bl 0x100343da4 ; [appname].DFTransaction.baseAmount.getter : __C.Decimal at DFTransaction.swift:64
0x100343cfc <+44>: ldur w9, [x29, #-24]
0x100343d00 <+48>: ldurh w10, [x29, #-20]
0x100343d04 <+52>: ldurh w11, [x29, #-18]
0x100343d08 <+56>: ldurh w12, [x29, #-16]
0x100343d0c <+60>: ldurh w13, [x29, #-14]
0x100343d10 <+64>: ldurh w14, [x29, #-12]
0x100343d14 <+68>: ldurh w15, [x29, #-10]
0x100343d18 <+72>: ldurh w16, [x29, #-8]
0x100343d1c <+76>: ldurh w17, [x29, #-6]
0x100343d20 <+80>: ldur x0, [x29, #-32]
0x100343d24 <+84>: str w9, [sp, #44]
0x100343d28 <+88>: str w10, [sp, #40]
0x100343d2c <+92>: str w11, [sp, #36]
0x100343d30 <+96>: str w12, [sp, #32]
0x100343d34 <+100>: str w13, [sp, #28]
0x100343d38 <+104>: str w14, [sp, #24]
0x100343d3c <+108>: str w15, [sp, #20]
0x100343d40 <+112>: str w16, [sp, #16]
0x100343d44 <+116>: str w17, [sp, #12]
0x100343d48 <+120>: bl 0x10051ca58 ; symbol stub for: objc_release
0x100343d4c <+124>: ldr w9, [sp, #44]
0x100343d50 <+128>: ldur x8, [x29, #-40]
-> 0x100343d54 <+132>: str w9, [x8] //EXC_BAD_ACCESS
0x100343d58 <+136>: ldr w10, [sp, #40]
0x100343d5c <+140>: strh w10, [x8, #4]
0x100343d60 <+144>: ldr w11, [sp, #36]
0x100343d64 <+148>: strh w11, [x8, #6]
0x100343d68 <+152>: ldr w12, [sp, #32]
0x100343d6c <+156>: strh w12, [x8, #8]
0x100343d70 <+160>: ldr w13, [sp, #28]
0x100343d74 <+164>: strh w13, [x8, #10]
0x100343d78 <+168>: ldr w14, [sp, #24]
0x100343d7c <+172>: strh w14, [x8, #12]
0x100343d80 <+176>: ldr w15, [sp, #20]
0x100343d84 <+180>: strh w15, [x8, #14]
0x100343d88 <+184>: ldr w16, [sp, #16]
0x100343d8c <+188>: strh w16, [x8, #16]
0x100343d90 <+192>: ldr w17, [sp, #12]
0x100343d94 <+196>: strh w17, [x8, #18]
0x100343d98 <+200>: mov sp, x29
0x100343d9c <+204>: ldp x29, x30, [sp], #16
0x100343da0 <+208>: ret
素早く入力いただきありがとうございます。私はそれが事実かもしれないと思ったが、別の方法でそれを処理することが可能かどうかはわからなかった。 – blwinters
実際、私はあなたの変更を実装したばかりで、私はまだまったく同じクラッシュを見ています。私はそれがMagicalRecordの私の使用と、Swift 3のObjective-Cタイプへの自動ブリッジの欠如と関連していると思う。これをすぐには分からない場合は、おそらくNSDecimalNumberにロールバックしてやります。 – blwinters
問題は、Decimalプロパティが '@ objc'と宣言されていても、CoreDataがDecimalのスカラーアクセサを気に入らないという点に根差している可能性があります。私の記事では、これらのアクセサが「KVCを壊さない」と宣言する方法について説明しますが、「Decimal」アクセサの場合、KVCは最も確実に壊れています。おそらくそれがここで働いているのです。カスタムアクセサを '@nonobjc var baseAmount:Decimal {get {...} set {...}}'として宣言し、問題が修正されたかどうかを確認してください。 –