2013-06-07 28 views
33

__block değişkenlerinin sözdizimi konusunda sorum var. __block'u kapsamdaki bir değişkende kullanabildiğinizi biliyorum, bu yüzden de yalnızca bloğun içinde değil. Ancak apple docs içinde tek bir noktada, ben bir alternatif göremediği:.__block için alternatif sözdizimi?

"tanımlayan kapsamında Değişkenler salt okunur bir blok kullanılan varsayılan olarak böyle bir değişkenin değerini değiştirmek gerekiyorsa, özel bir söz dizimi kullanabilir: Bu örnekte

int count = 0; 
float cumulativeValue = 0.0; 
UpdateElements(a, N, ^(float element){ 
    |count, cumulativeValue| 
    float value = factor * element; 
    ++count; 
    cumulativeValue += value; 
    return value; 
}); 

, sayısı ve blok kapsamı başlangıcında ortak değişken virgülle ayrılmış listesinde cumulativeValue blok içinde tadil edilmiş, bu nedenle de dahildir.

Bu sözdizimi daha temiz görünüyor ve daha sonra bildirmediğiniz ancak kapsamda olduğunuz değişkenleri değiştirebileceğinizi varsayalım. Ancak, bunu başka bir yerde görmedim ve xCode derleyicisi temel bloğumu beğenmiyor. Bu meşru sözdizimi mi?

cevap

45

Vay. Bu sözdizimini uzun zamandır görmedim. Bu, blokların geliştirilmesi sırasında keşfedilen çeşitli sözdizimsel yapılardan biriydi. Nihayetinde reddedildi, çünkü niyetin bildirilmesinde çok belirsizdi ve sonuçta ortaya çıkan davranış kafa karıştırıcı olurdu.

İki bloğu, ikisi de |a| aracılığıyla readwrite olarak bildiren üç bloklu bir kapsamı düşünün. Değişkenin değerinin, bloğun kapsamının bazılarında yazıldığı kapsamın üst kısmındaki int a = 5; bildirgesinden hiçbir şekilde haberi yoktur. Ayrıca, derleyici uygulamasını önemli ölçüde daha zor hale getirecektir. C'deki gelenek, bir değişken depolama türünün bildirimin yapıldığı zamanda düzeltilmesidir. Bu sözdizimini desteklemek bu beklentiyi bozardı. Bu nedenle, volatile ya da static'a benzer bir depolama tipi değiştiricisinin kullanılması kararlaştırılmıştır. __block, öncelikle __ öneki, çıplak bir anahtar sözcük ekleyerek kırılacak kod miktarını büyük ölçüde azalttığı için kullanıldı.

Bunu sorduğunuz için teşekkür ederiz. Bug dosyalandı ve bu belgeler eninde sonunda düzeltilecek ve/veya kaldırılacak.

+0

Çok ilginç! Tarih için teşekkürler –

+0

Yani, sözdizimini formüle etmeden önce belgelerin neden yazıldığına dair bir fikrin var mı? – CodaFi

+4

Dokümantasyon folk, bir şeyi nasıl tutarlı bir şekilde açıklayacağını anlayamazsa, tasarımın ciddi şekilde hatalı olduğuna dair kesin bir işarettir, bu nedenle tasarım sürecinin erken aşamalarında yer alırlar. Bu belgeler ilk olarak, blokların ilk ilan edildiği WWDC için üretilmiş olabilir. – bbum

5

The | | sözdizimi Smalltalk'tan esinlenilmiştir, tabiki "blok" terimiyle.

bbum işaret ettiği için, decl sitesinin işaretlenmesi daha dürüsttür. blok dışı kullanım ve modellendiğinde C ile aynı çizgide daha fazla, yeni bir (C) nesnesi "süresi" olarak bittiğinde.

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1451.pdf