2016-03-31 15 views
0

Bir blok içinde bir örnek değişkeni kullandığımda, en iyi uygulama ondan önce __blok eklemektir, bu yüzden kapsam eş zamansızdır ve kullanabileceğim sonra Örnek:İşlev parametrelerini blokta kullanmalı mıyım yoksa bunları __blok değişkenleri olarak tutmalı mıyım

-(void) someFunctionWithParam:(NSString *) nameIWillUseInBlock { 

    [self functionWithCallback:^(NSString *string) { 

     NSString *stringWithString = [NSString stringWithFormat:@"%@%@", nameIWillUseInBlock, @"with bla"]; 

     //Here Ill do somthing with this string 
    }]; 
} 

Ya şöyle bir __block örneği olarak param tutmalı:

-(void) someFunction { 

    __block NSString *nameIWillUseInBlock = @"Some name"; //Here ill use the __block 

    [self functionWithCallback:^(NSString *string) { 

     NSString *stringWithString = [NSString stringWithFormat:@"%@%@", nameIWillUseInBlock, @"with bla"]; 

     //Here Ill do somthing with this string 
    }]; 
} 

Benim soru ne işleve geçirilen params hakkında, çok gibi kullanabilirsiniz edilir:

-(void) someFunctionWithParam:(NSString *) nameIWillUseInBlock { 

    __block NSString *asyncNameIWillUseInBlock = nameIWillUseInBlock; 

    [self functionWithCallback:^(NSString *string) { 

     NSString *stringWithString = [NSString stringWithFormat:@"%@%@", asyncNameIWillUseInBlock, @"with bla"]; 

     //Here Ill do somthing with this string 
    }]; 
} 

ve ben bir __block örneği olarak params'ı değil kullanmalısınız, nasıl kapsam cadı parametreler geçerli kapsama geçmesi mi biliyor?

Teşekkürler.

+2

gösterecektir

__block int anInteger = 42; void (^testBlock)(void) = ^{ NSLog(@"Integer is: %i", anInteger); }; anInteger = 84; testBlock(); 

"Depolama Paylaşma __block Değişkenler kullan" en iyi uygulama değildir. Sadece '__block' ihtiyacınız olacak eğer blogu – dan

cevap

2

Ben bölümünde "Bloklar Kapayan Kapsam gelen Değerler Yakalama Can" düşünmek konu Working With Blocks gerçekten iyi bir elma doc olduğunu Özellikle aradığınız budur.

"Bu örnekte, anInteger bloğunun dışında ilan edilir, ancak blok tanımlandığında değer yakalanır.

Sadece değer aksi belirtmedikçe, yakalanır. Bu demektir ki sen değiştirirseniz zaman arasında değişkenin dış değeri blok tanımlamak ve sefer

Yani bunun bakarsanız "çağrılan:

int anInteger = 42; 

void (^testBlock)(void) = ^{ 
    NSLog(@"Integer is: %i", anInteger); 
}; 

anInteger = 84; 

testBlock(); 

günlük

gösterecektir
Integer is: 42 

günlüğü ilk örnekteki gibi `__block` kullanma

Integer is: 84 
+0

Bunu göndermek üzereydi. Çok özlü cevap! – mattsven

+0

Harika cevap, Teşekkürler (: – MCMatan

-1

Bu kodu doğrudan blokta kullanabilirsiniz.

-(void) someFunctionWithParam:(NSString *) nameIWillUseInBlock { 

[self functionWithCallback:^(NSString *string) { 

    NSString *stringWithString = [NSString stringWithFormat:@"%@%@", nameIWillUseInBlock, @"with bla"]; 

    //Here Ill do somthing with this string 
}]; 

} Burada

+0

bloğu içinde yeniden atayacaksanız, biliyorum, soru, params kullanmanın farkı nedir ve değişkenleri kullanarak – MCMatan

+0

@PiratM: Fark yoktur. Params değişkenlerdir. '__block' veya değil tamamen ayrı bir husustur. '__block', verdiğiniz tüm örneklerde işe yaramaz. – newacct

İlgili konular