2017-10-03 12 views
0

iOS開発でメモリ管理について学びたいと思っています。ですのでDeinit and Memory leakと混同しました

class Human { 
    var passport: Passport? 
    let name: String 

    init(name: String) { 
    self.name = name 
    } 

    deinit { 
    print("I'm gone, friends") 
    } 
} 

我々は、インスタンスを作成した後、参照カウントが1である:私はこの記事/チュートリアル読み:そのチュートリアルでMake Memory Management Great Again

を、このようなクラスの内部deinit方法があり、強い参照。このステップまで、私は理解しています。

var bob: Human? = Human(name: "Bob Lee") 

私たちがインスタンスを作成すると、実際にはRAMにスペースが必要です。

変数 'bob'にnilを指定すると、デイニットが印刷され( "I'm gone、friends")、リレーションシップは存在しなくなるため、参照カウントは0になり、両方のオブジェクトの割り当てが解除されます。

私は混乱して作る事:私は従って、私は私のクラスで「deinit」を見ることはない、と私はインスタンスにnilを割り当てることはありませんチュートリアルから/私の実際のコードで

  1. を、そのオブジェクト割り当てが解除されることはありませんし、脂肪のような私の記憶の中にスペースを取るでしょうか?私は自分のコードでdeinitを書くべきですか?自動参照がオブジェクトであるかどうかを示すために数える

:私はスペースの制限上、それはデータオブジェクトで満たされるでしょうし、最終的に私のアプリが

  • を破るならばと思うので、それはと言われてまだ が使用されているかはもはやもはや

  • 必要を必要としませんか?どういう意味ですか?

    var bob: Human? = Human(name: "Bob Lee") 
    // bob now has a reference count of 1 
    // the memory at the bob location is ready to access and/or modify 
    // this means bob is still alive and we can find out things about him 
    
    print(bob!.name) 
    // prints "Bob Lee" 
    
    bob = nil 
    // deinit called, "I'm gone, friends" 
    // bob now has a reference count of 0, and ARC has released the object that was stored here 
    // we cannot find out anything about bob 
    // the memory at the location of bob is now released 
    
    print(bob!.name) 
    // Error: Unexpectedly found nil while unwrapping optional value 
    

    のご質問にお答えするには:ちょうどあなたの例から明確にする

    +2

    [新しい自動参照カウントメカニズムはどのように機能しますか?](https://stackoverflow.com/questions/6385212/how-does-the-new-automatic-reference-counting-mechanism-work) –

    答えて

    0

    1. あなたは(それがコンテキストに応じて意味を成さない場合があります)bobnilを割り当てる必要がありません場合はbobのタイプをではなくHumanに割り当てる必要があります。これは、ボブが絶対に決してできないことを意味し、あなたのコードを推論するのをはるかに簡単にします。このではありません。つまり、bobにあるHumanオブジェクトはメモリから決して消えません。たとえばbobがある時点で割り当て解除されているビューコントローラ内にある場合(ユーザがそのVCからナビゲートするか、またはアプリケーションが閉じている場合)、bobももちろんシステムによって割り当て解除されます。

    2. 「もう不要になる」とは、コードからのアクセスの観点から「必要」を意味します。 bobがnilに設定されている場合、なぜ彼についての情報に再びアクセスする必要がありますか?そうではないので、bobにあるオブジェクトの参照カウントは0になり、は不要になり、は解放され、割り当てが解除されます。

    私はあなたのためにいくつかのものをクリアできることを願っています。