2012-08-04 16 views
5

iOS uygulama geliştirmede, daha sonra bir nesnenin sahipliğini sona erdirmek için NSAutoreleasePool kullanıyoruz.Her iş parçacığı için NSAutoreleasepool'u neden kullanmamız gerekiyor?

Ancak neden farklı konular arasında paylaşılabilir?

Yeni bir iş parçacığı kullanmak istediğimde neden yeni bir otomatik kitaplık oluşturmamız gerekiyor?

DÜZENLEME: taskinoor bu her iş parçacığı ayrı autoreleasepool olması gerektiğini şekilde tasarlanmıştır neden benim soruydu belirtildiği gibi

.

+1

[Bu soru sorunuzla çok ilgili görünüyor] (http://stackoverflow.com/questions/4547652/does-every-thread-need-its-own-autorelease-pool) –

+1

autoreleasepool {...} 'yerine NSAutoreleasePool'. Belgelere göre, daha verimli. Ve eğer ARC'ye göç ederseniz, bu zorunludur. –

+0

Neden bu düzenlemeye ihtiyacın olduğunu bilmiyorum, cevabım bunun nedenini açıklıyor :) –

cevap

5

Çok iş parçacığı otomatikleştirme havuzları için tasarım zorluğu, bunların ne zaman boşaltılacağıdır. Bir nesne hala kullanılmakta iken havuzu tahliye ederseniz, o zaman çökecektir. Her bir iş parçacığı için, çalışma döngüsünün dışında olduğunuzu ve böylece otomatik olarak yüklenen nesnelerin boşaltılabileceğini söylemek kolaydır. Çok iş parçacıklı bir durumda, iş parçacığınızın kendi akışları sonunda senkronize edilmesi gerekir, böylece onları boşaltmak için güvenli bir noktada olduğunuzdan emin olabilirsiniz. Senkronize edilmiş bu sekmeler bu şekilde kötü bir fikirdir, çok fazla boş zaman yaratır ve programı yavaşlatır.

+1

Bir adım daha atın; herhangi bir iş parçacığı bir şey beklemede engellendiyse - ağ, iş parçacığı durumu, diğer G/Ç - sonra genel havuz boşaltılamaz. – bbum

0

ben sallanmasını havuzları oluşturduğunuz iş parçacığı veya bir sallanmasını havuzu oluşturmak yoksa her iplik sallanmasını havuzları

kendi bacası vardır Cocoa apples memory management guide göre, dişler arasında paylaşılır sanmıyorum Ayır, o zaman autorelease işlevi çalışmaz, bu nedenle bellek izi artacaktır

2

Her iş parçacığı farklı bir yürütme bağlamıdır - bir iş parçacığı er ya da geç çıkabilir, farklı yaşamlar ve bellek yönetimi gereksinimleriyle farklı kaynaklar kullanabilirler. iş parçacığı bağımsız olarak yönetilmelidir.

1

Bu şekilde tasarlandıkları için. Sanırım senin sorunun bu şekilde tasarlandıkları sorusu. Eminim% 100 emin değilim, ancak olası bir sebep, bir kaynağın iş parçacıkları üzerinden paylaşılmasının maliyetinin olmasıdır. Paylaşılan havuzdaki her değişiklik sırasında, her bir iş parçacığının performansı düşürecek olan kilidi açması gerekir. Bir kaynak, birden çok iş parçacığı arasında paylaşılmalı, yalnızca bu paylaşımın gerekli olması durumunda, otomatikleştirme havuzlarında söz konusu değil. Adanmış autorelease havuzu kullanmak daha iyi performans gösterecektir. Bu tasarım kararı için olası bir sebep olabilir.

+0

Teşekkürler Taskinoor – Krishnan

+1

İyi tahmin, ama eksik. Otomatik doldurma havuzları iş parçacığı başına olmalıdır, çünkü havuzun güvenli bir şekilde boşaltılabilmesi için * tüm iş parçacıklarının * havuzlarının boşaltılabileceği bir durumda olmaları gerekir. * Herhangi bir iş parçacığı * girişin beklemesini engellediyse, boşaltma gerçekleşemedi. Jeffeery'nin cevabı doğru. – bbum

+1

@bbum, teşekkürler. Havuzu boşaltmayı düşünmedim ve Jeffery'nin cevabının benimkinden daha iyi olduğunu kabul ediyorum. – taskinoor