Amaç-C'de "tek yönlü boşluk" kullanım durumu?


107

NSObject.h içinde garip bir anahtar kelime buldum

- (oneway void)release;

Web'i araştırdım ve Erlang'ın mesaj geçişine benzeyen asenkron mesaj geçişiyle ilgili olduğunu öğrendim.

Görünüşe göre bu pek çok ilginç şey yapabilir. Bu anahtar kelimenin bazı iyi kullanım örnekleri nelerdir?


5
Hatırlaması kolay: oneway voidkodlamada bazen gördüğümüz o güzel tesadüfi metaforlardan biridir, bu durumda ölüm için. "Diğer tarafta bir şey varsa, bize söyleme."
yapı

Yanıtlar:


111

onewayfarklı iş parçacıkları veya uygulamalar arasında amaç-c nesnelerinin kullanımına izin veren dağıtılmış nesneler API'si ile kullanılır. Sisteme, yöntem dönene kadar çağıran iş parçacığını engellememesi gerektiğini söyler. Bu olmadan, yöntemin dönüş türü geçersiz olsa bile çağıran engelleyecektir. Açıkçası, hiçbir zaman void dışında bir şeyle kullanılmaz, çünkü böyle yapmak, yöntemin bir şey döndürdüğü anlamına gelir, ancak arayan bunu anlamaz.

Dağıtılmış nesneler hakkında daha fazla bilgi için bkz. Cocoa Conceptual DistrObjects .


6
Bağlantı artık çalışmıyor. Apple'ın belgelerinde bulamadım ama buldum: chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf , "oneway" anahtar kelimesi için iyi bir açıklama sağlar. Bkz. Bölüm 4.4.5 (pdf sayfa 24)
jlmendezbonini

@Robin Güncelleme için teşekkürler. Son birkaç aydır gitmişti, ancak Apple'dan başka bir referans bulamadım, bu yüzden onu yeni bıraktım.
ughoavgfhw

ve ağ görevlerini ateşlemenin tek yolunun onları alt iş parçacığı olarak kullanmak olduğunu düşündüm ... gcd_async ve arkadaşlarını kullanarak ..
Nirav Bhatt

18

Apple'ın belgelerine göre tek yönlü, yalnızca dağıtılmış nesne için kullanılır (ve çoklu okuma için değil).

Tek yönlü değiştirici, yalnızca nesne uzaksa kullanılır. Bu durumda, serbest bırakma çağrısı eşzamansız olarak geri dönebilir (yöntem sonlandırılmadan önce). Bir ağda bu mantıklıdır çünkü bir geri dönüş mesajını beklemek biraz zaman alabilir.

Release yönteminin dönüş değeri yoktur ve bu nedenle çağrı eşzamansız olarak çalıştırılabilir. Bunun aksine, saklama ve otomatik bırakma bir id döndürür ve bu nedenle geri dönüş mesajının ağ boyunca aktarılmasını beklememiz gerekir.


İlgili bir sorum var: onewayAnahtar sözcüğün kullanılması, çağrılan yöntem yürütülürken mesajın çağıran iş parçacığını engellememesine neden olursa, bu, çağrılan yöntemin ikinci bir iş parçacığında yürütülmesini sağlar. Bu çok görevli değil mi (en basit haliyle)? Bunu, bazı küçük işlemleri hızla (fazla çaba harcamadan) başka bir iş parçacığına ayırmak için kullanabilir miyim ? Çok teşekkür ederim.
Constantino Tsarouhas

1
Hayır, yapamazsınız. Dağıtık hesaplamada iş parçacığı farklı bir makine / süreçte yürütülür. PerformSelector: onThread: withObject: waitUntilDone: amacınız için kullanabilirsiniz.
Freeman

2
Peki - (oneway void) releaseo zaman ne olacak ? Başka bir makinede veya işlemde değil.
Constantino Tsarouhas

Tam olarak bir yolun tam olarak neyle ilgili olduğunu açıklamak için +1 -> one waybir yöntemi tanımlamak anlamına gelir don't wait for the method to complete and return anything. block it if there is any n/w trafic or so. Mantıklı geliyor muyum?
thesummersign
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.