İOS5'teki güçlü ve zayıf depolamanın açıklaması


114

İOS5 geliştirme ve objektif-c kullanmada yeniyim. Güçlü ve zayıf depolama arasındaki farkı anlamakta güçlük çekiyorum . Belgeleri ve diğer SO sorularını okudum, ancak hepsi benimle aynı gibi geliyor ve daha fazla içgörü yok.

Belgeleri okudum : ARC'ye Geçiş - iOS4 saklama, atama ve yayınlama şartlarına atıfta bulunuyor; kafamı karıştıran Ardından, güçlü ve zayıfı ayırt ettiği Open U CS193p'ye bakıyorum:

Strong : "Ben artık işaret etmeyene kadar bunu
yığında tut " Zayıf : "Başka biri güçlü bir şekilde işaret ettiği sürece bunu sakla"

İki tanım aynı değil mi = eğer işaretçi artık bir nesneyi göstermiyorsa, nesneyi tutan hafızayı boşaltın? İşaretçiler, yığın, bellek ayırma veya ayırma kavramlarını anlıyorum - ama güçlü ve zayıf arasındaki fark nedir?


Bellek yönetimi modeli, ARC kullanıyor olsanız bile hala geçerlidir. Yine de referans sayımını anlamanız gerekiyor, sadece manuel olarak yapmanız gerekmiyor. Yani son paragrafınız mantıksız bir talep.
jrturton

Yanıtlar:


509

Aradaki fark, bir nesnenin, kendisine yönelik güçlü işaretler kalmaz kalmaz kaldırılacağıdır . Zayıf işaretçiler onu işaret etse bile, son güçlü işaretçi gittiğinde, nesnenin dağıtımı kaldırılır ve kalan tüm zayıf işaretçiler sıfırlanır.

Belki bir örnek sırayla.

Nesnemizin bir köpek olduğunu ve köpeğin kaçmak istediğini (ayrılmak) hayal edin.

Güçlü işaretçiler köpeğin tasması gibidir. Tasma köpeğinize takılı olduğu sürece köpek kaçmayacaktır. Eğer beş kişi tasmasını bir köpeğe bağlarsa (bir nesneye beş güçlü işaret), o zaman köpek beş tasmanın tamamı çıkana kadar kaçmayacaktır.

Öte yandan zayıf işaretçiler, köpeği işaret eden ve "Bak! Bir köpek!" Diyen küçük çocuklar gibidir. Köpek hala tasmalı olduğu sürece, küçük çocuklar hala köpeği görebilirler ve yine de onu gösterirler. Bununla birlikte, tüm tasmalar çıkar çıkmaz, köpek kaç tane küçük çocuk işaret ederse etsin kaçar.

Son güçlü işaretçi (tasma) artık bir nesneyi işaret etmediği anda, nesnenin dağıtımı kaldırılacak ve tüm zayıf işaretçiler sıfırlanacaktır.


2
Apple'daki Malcom Crawford'un birkaç yıl önce verdiği bir analojiye dayanıyor. Nereden aldığını bilmiyorum.
BJ Homer

Bir kitapta benzer (ark öncesi) bir şey okuduğumu hatırlıyorum, Hillegass olduğunu düşünüyorum, ama o zaman başka bir yerden alabilirdi ... yine de iyi bir şey!
jrturton

14
+1 mükemmel örnek. bu, Hillegass'ın tasmaların nasıl tutulduğu / bırakıldığı örneğinin bir türevi, ancak bu uyarlamayı güçlü / zayıf için seviyorum.
Dave DeLong

2
@DaveDeLong: Peki, ARC ile 10.6'da yasa dışı . Onları hiç kullanamazsınız. Yani bu biraz alakasız bir nokta.
BJ Homer

5
Bir başka iyi olanı ise Helyum balonlarıdır: En az bir ip tutulduğu sürece, uçup gitmeyecektir. Tasma / balon benzetmeleri, insanların "sahipliğin" elde tutma / bırakma ile yönetildiğini unutmalarını sağlamada da iyidir.
Steve Weller

34

İki tanım aynı değil mi?

Kesinlikle hayır. Belirttiğiniz iki tanımdaki temel fark, "başkası olduğu sürece" dir. Önemli olan "başka biri" dir.

Aşağıdakileri göz önünde bulundur:

__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;

Şimdi iki işaretimiz var <some_object>, biri güçlü, diğeri zayıf. Biz ayarlarsanız strongObjectiçin nilöylesine gibi:

strongObject = nil;

Ardından, özetlediğiniz kuralları uygularsanız, kendinize şu soruları soracaksınız:

  1. Güçlü: "artık işaret etmeyene kadar bunu yığında tut"

    strongObjectartık işaret etmiyor <some_object>. Yani onu tutmamıza gerek yok.

  2. Zayıf: "Başkası güçlü bir şekilde işaret ettiği sürece bunu saklayın"

    weakObjecthala işaret ediyor <some_object>. Ama kimse bu yana başka buna noktaları, bu kural da bunu tutmak gerek olmadığı anlamına gelir.

Sonuç, <some_object>atamanın kaldırılması ve çalışma zamanınız destekliyorsa (Lion ve iOS 5 üstü) weakObjectotomatik olarak şu şekilde ayarlanacaktır:nil .

Şimdi set ne olur düşünün weakObjectiçin nilöylesine gibi:

weakObject = nil;

Ardından, özetlediğiniz kuralları uygularsanız, kendinize şu soruları soracaksınız:

  1. Güçlü: "artık işaret etmeyene kadar bunu yığında tut"

    strongObjectişaret ediyor <some_object>. Yani onu korumamız gerekiyor.

  2. Zayıf: "Başkası güçlü bir şekilde işaret ettiği sürece bunu saklayın"

    weakObjectişaret etmiyor <some_object>.

Sonuç olmasıdır <some_object>edilir değil ayırmanın, ancak weakObjectolacak nilişaretçi.

[Tüm varsayımların <some_object>, başka bir yerde başka bir güçlü referansla / "tutulmanın" başka yollarıyla gösterilmediğine dikkat edin]


1
Dolayısıyla, güçlü ve zayıf arasındaki temel fark, güçlü bir şekilde işaret edilen nesnelerin serbest bırakılmasının, ilgili tüm zayıf işaretçileri otomatik olarak sıfırlayacak olmasıdır. Ve zayıf bir işaretçinin bir şeyi işaret etmesi için, her zaman güçlü bir işaretçi vardır. Öyleyse, ana uygulama nesnesine güçlü bir şekilde işaret edilmesi gerekir.
KMC

Zayıf bir işaretçinin geçerli bir şeye işaret etmesi için, evet, güçlü bir işaretçi olmalıdır. Buna, iOS 5 ve Lion'un zayıf referansların otomatik olarak doldurulmasını desteklediği gerçeğini ekleyin ve söylediklerinizi alırsınız. iOS 4'ün çalışma zamanı yok değil Gerçi desteklemektedir. "Ana uygulama nesnesi", UIApplicationnesneyi kastettiğinizi varsayıyorum ? Buna iç işleyiş tarafından güçlü bir şekilde değinilecektir UIKit- ama bunun için endişelenmenize gerek yok.
mattjgalloway

"StrongObject" yerine "strongObjectPointer" gibi bir kelime kullanabileceğinizi düşünüyorum. Yani programlama için yeni insanların daha iyi anlamı olacaktır. Güzel yakalama @BJ Homer post Mr.Matt.Interesting :)
Vijay-Apple-Dev.blogspot.com

2

kuvvetli

  1. Mülkiyet ile atanan değer arasında sahiplik oluşturur.
  2. Bu, ARC'deki nesne özelliği için varsayılandır, bu nedenle referans sayısı konusunda endişelenmenize ve referansı otomatik olarak serbest bırakmanıza izin vermez.
  3. Korumanın yerine geçer. Yalnızca ve yalnızca muhafaza olarak kullanmamız gerektiğinde kullanırız.

Güçsüz

  1. Mülk ve atanan değer arasında sahiplik dışılıklar oluşturur.
  2. Güçlü, üst nesnede kullanılır ve zayıf, ebeveyn bırakıldığında alt nesnede kullanılır, ardından alt nesne başvurusu da sıfır olarak ayarlanır
  3. Tutma döngülerini önlemeye yardımcı olur.
  4. Çöp toplayıcı tarafından toplandığında başvurulan nesneyi korumaz.
  5. Zayıf, esasen tahsis edilmiş, tutulmayan mülkiyettir.

Burada tutma döngüsünün tipik olarak ne olduğundan bahsetmeye değer. İki nesnemiz var: A nesnesi ve B nesnesi A nesnesi B'ye güçlü bir referansa sahip ve B nesnesi A nesnesine güçlü bir referansa sahip. Başka hiçbir şeyin A veya B nesnesine güçlü bir referansı yok
boro

2

Başka bir örnek: Öğrenci, seçmeli dersleri ( ) alsa da ( ) tüm temel dersleri ( ) bitirdiği sürece Objectmezun olabileceği ( deallocate) varsayılır . Başka bir deyişle: güçlü işaretçi, bunun serbest bırakılmasının tek faktörüdür .strong pointersweak pointersObject


1

Hayır, aynı değiller ama çok farklılar. Strong'u yalnızca nesneyi tutmanız gerektiğinde kullanırsınız. Diğer durumlarda zayıf kullanırsınız, avantajlı olarak nesnenin yığından kaldırılıp kaldırılmadığını bilebilirsiniz çünkü kimse onu tutmuyor.


1

Bu partiye oldukça geç kaldığımı biliyorum, ancak "güçlü ve zayıf bellek modelleri" nin anlamının yazılımdan mı yoksa donanımdan mı bahsettiğinize bağlı olduğunu belirterek konuyu karıştırmanın önemli olduğunu düşünüyorum.

Donanım için, zayıf veya güçlü, sıralı tutarlılık için destek olup olmadığını gösterir.

[SC şu anlama gelir] ... herhangi bir yürütmenin sonucu, tüm işlemcilerin işlemleri bazı sıralı sırayla yürütülüyormuş gibi aynıdır ve her işlemcinin işlemleri, programı tarafından belirtilen sırada bu sırada görünür. - Lamport, 1979

WTF bunun hafıza ile ilgisi var mı? Farklı işlemciler tarafından değişkenlere yazılanların tüm işlemciler tarafından aynı sırada görülmesi gerektiği anlamına gelir. Güçlü bir modele sahip donanımda bu garantilidir. Zayıf bir modele sahip donanımlarda öyle değildir.

Mevcut cevaplar soruyu yalnızca yazılım bellek modelleri açısından yorumlar. Donanım, programlama ile alakasız değildir. Bu soru, genellikle Arm7 işlemcilerde çalışan iOS'tan bahseder. Arm7 zayıf bir bellek modeline sahiptir. Güçlü bir modele sahip işlemcilere alışkın programcılar için - ki bu hepimizdir çünkü x86 ve x64 güçlü bir modele sahiptir - bu korkunç bir tuzaktır. Çıkmak için başka bir iş parçacığını işaret etmek için bool kullanmak, güçlü bir modelde iyi çalışır. Arm'daki aynı kod, bayrağı geçici olarak işaretlemediğiniz sürece hiç çalışmaz ve o zaman bile düzensizdir.

Arm8 + 'nın bunu tamamen edinme / yayınlama desteği ile tamamen değiştirdiği doğru olsa da, eski yazılım bu desteği kullanmaz. Eski yazılım, üç telefon işletim sisteminin tümünü ve bunlarda çalışan her şeyi, ayrıca güncellenene kadar derleyicileri ve kitaplıkları içerir.

Bu konunun daha kapsamlı bir incelemesi için sizi eşsiz Herb Sutter'a yönlendiriyorum .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.