2016-09-15 16 views
0

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  

答えて

2

「プリミティブアクセサは常にNULL可能Objective-Cの参照型です」という。これはisOptional設定の影響を受けない真理です。あなたがそれらのクラッシュで見つけたものです。このように

は、原始的なアクセサはそのように宣言する必要があります。

方法のうちそれと@NSManaged private var primitiveBaseAmount: NSDecimalNumber?

、あなたはbaseAmountアクセサがDecimal(省略不可)であることを宣言したので、あなたのカスタムgetreturn primitiveBaseAmount?.decimalValue ?? 0のようにヌルのプリミティブ値に遭遇すると、インプリメンテーションはクラッシュしない何かを行わなければなりません。

+0

素早く入力いただきありがとうございます。私はそれが事実かもしれないと思ったが、別の方法でそれを処理することが可能かどうかはわからなかった。 – blwinters

+0

実際、私はあなたの変更を実装したばかりで、私はまだまったく同じクラッシュを見ています。私はそれがMagicalRecordの私の使用と、Swift 3のObjective-Cタイプへの自動ブリッジの欠如と関連していると思う。これをすぐには分からない場合は、おそらくNSDecimalNumberにロールバックしてやります。 – blwinters

+0

問題は、Decimalプロパティが '@ objc'と宣言されていても、CoreDataがDecimalのスカラーアクセサを気に入らないという点に根差している可能性があります。私の記事では、これらのアクセサが「KVCを壊さない」と宣言する方法について説明しますが、「Decimal」アクセサの場合、KVCは最も確実に壊れています。おそらくそれがここで働いているのです。カスタムアクセサを '@nonobjc var baseAmount:Decimal {get {...} set {...}}'として宣言し、問題が修正されたかどうかを確認してください。 –

関連する問題