私は貴金属の価格を追跡するプログラムを持っています。"割り当て解除されたオブジェクトを保持しようとしました"循環参照
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)")
}
、資産プリントの名前を持っています??
私が弱いときは、2番目の行にEXC_BAD_INSTRUCTION(コード= EXC_i386_INVOP)が表示されます。そう、はい、それは無になっています。私はちょうどメモリリークを避けようとしています。資産のデータにアクセスしたいだけで、ループの2回の繰り返しで可用性の状態が変わる理由はわかりません。 – Brian
最初のループでは、 'asset'への参照があります。これはループの最後にスコープから外れるので、' asset'は解放され、もう2番目のループには存在しません。循環参照がある場合(AはBへの参照を保持し、BはAへの参照を保持します)、メモリリークについて心配する必要があります。その場合、通常は「弱い」を使用する必要があります。あなたのケースでは、 'asset'が' Transaction'への参照を保持していないと仮定すると、どちらも必要ありません。 – Michael
は多対1の関係です。 AssetDTOには多くのトランザクションがあり、TransactionDTOにはAssetDTOがあります。それで私は循環参照を持っている。 AssetDTOに配列がある場合は、アセットではなく参照付きの配列になると思います。 – Brian