2016-10-04 12 views
0

私は貴金属の価格を追跡するプログラムを持っています。"割り当て解除されたオブジェクトを保持しようとしました"循環参照

public class AssetDTO: Equatable { 
var name: String! 
var transactions = [TransactionDTO]() 

TransactionDTOスニペット:

A TransactionDTOはAssetDTO

AssetDTOスニペットに所有されていない参照有するUIコントローラクラスの

unowned var asset: AssetDTO 

init(asset:AssetDTO, type:Constants.TransactionType) { 
    self.asset = asset 
    self.type = type 
    self.date = Date() 
} 

を、Iはでトランザクションを反復しますテーブル、および関連する金属(金、銀など)を表示します。

libswiftCore.dylib`_swift_abortRetainUnowned: 
0x108d44cc0 <+0>: leaq 0x3058b(%rip), %rax  ; "attempted to retain deallocated object" 
0x108d44cc7 <+7>: movq %rax, 0x95f0a(%rip)  ; gCRAnnotations + 8 
0x108d44cce <+14>: int3 -> 0x108d44ccf <+15>: nop  

任意のアイデア:私のviewDidLoadでは、エラーを示すために、私は2番目のループでは、私は取得するには、次のコード最初のループでは

var txs = [TransactionDTO]() 
    for asset in assetManager.findAllMetals() { 
     for tx in asset.transactions { 
      txs.append(tx) 
      print("the asset name for this is \(tx.asset.name)") 
     } 
    } 

    for tx in txs { 
     print("the asset name for this is \(tx.asset.name)") 
    } 

、資産プリントの名前を持っています??

答えて

1

unowned

unowned var asset: AssetDTO 

から unownedを削除するには、効果的に weakのようなもので、おそらく他には何も資産を参照されていないので、それは割り当て解除されます。しかし、 weakと異なり、 unownedは変数を除外しません。したがって、あなたが得ているエラー。 weakに変更すると、おそらくゼロになることがわかります。

アセットを保持するトランザクションとアセットを参照する各トランザクション間の循環参照を回避したいので、後者はweakと宣言する必要があります。

問題は次にassetManager.findAllMetals()の範囲です。返される資産への参照が何も保持されない場合、それらは破棄されます。トランザクションの配列への参照があるので、それらが参照するアセットは、最初のループの後に破棄されます。

最も簡単な修正は、最初のループの範囲外で独自の参照を保持することです。

let allMetails = assetManager.findAllMetals() 
var txs = [TransactionDTO]() 
for asset in allMetals { 
    for tx in asset.transactions { 
     txs.append(tx) 
     print("the asset name for this is \(tx.asset.name)") 
    } 
} 

for tx in txs { 
    print("the asset name for this is \(tx.asset.name)") 
} 
+0

私が弱いときは、2番目の行にEXC_BAD_INSTRUCTION(コード= EXC_i386_INVOP)が表示されます。そう、はい、それは無になっています。私はちょうどメモリリークを避けようとしています。資産のデータにアクセスしたいだけで、ループの2回の繰り返しで可用性の状態が変わる理由はわかりません。 – Brian

+1

最初のループでは、 'asset'への参照があります。これはループの最後にスコープから外れるので、' asset'は解放され、もう2番目のループには存在しません。循環参照がある場合(AはBへの参照を保持し、BはAへの参照を保持します)、メモリリークについて心配する必要があります。その場合、通常は「弱い」を使用する必要があります。あなたのケースでは、 'asset'が' Transaction'への参照を保持していないと仮定すると、どちらも必要ありません。 – Michael

+0

は多対1の関係です。 AssetDTOには多くのトランザクションがあり、TransactionDTOにはAssetDTOがあります。それで私は循環参照を持っている。 AssetDTOに配列がある場合は、アセットではなく参照付きの配列になると思います。 – Brian

関連する問題