Blok içindeki bir değişkeni Blok dışındaki bir değişkene atama


381

Hata alıyorum

Değişken atanamaz (__block türü belirleyicisi eksik)

hatta aPerson = participant;. Bloğun aPersondeğişkene erişebildiğinden ve değişkenin aPersondöndürülebildiğinden nasıl emin olabilirim?

Person *aPerson = nil;

[participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {   
    Person *participant = (Person*)obj;

    if ([participant.gender isEqualToString:@"M"]) {
        aPerson = participant;
        *stop = YES;
    }
}];

return aPerson;

Yanıtlar:


779

Sorununuzu çözmek için bu kod satırını kullanmanız gerekir:

__block Person *aPerson = nil;

Daha fazla ayrıntı için lütfen bu eğiticiye bakın: Bloklar ve Değişkenler


101
İki alt çizgi __blockön ekinin bulunduğunu lütfen unutmayın .
Eric Brotto

12
__blockbenim hatamı kullanarak gitti, ama değer blok dışında tutmuyor. Burada herhangi bir yardım
User16119012

7
Blok, çağrılması gerektiği gibi iyi bir şekilde çağrılır, başka bir deyişle, bloklar 'hemen' koşmaz.
Tom Andersen

1
Bloklar SAĞ UZAK çalıştırmazsa, bu cevap kabul edilmemelidir, çünkü bu onu büyük bir anlaşma kırıcı yapar.
durazno

3
Bu cevap gönderilen soruya göre doğrudur, aklınızda farklı bir senaryo varsa başka bir soru göndermek için çekinmeyin.
Devarshi

40

Sadece kendime yaptığım bir hatayı hatırlatmak

 __block

bildirim, değişken ilk olarak bildirilirken, yani bloğun DIŞINDA değil, içinde değil. Bu, değişkenin değerini blok dışında tutmaması hakkındaki yorumlarda belirtilen sorunları çözmelidir.


18

__blockBir blok içinde herhangi bir değişken türünü bildirmek ve atamak için öneki kullanmanız yeterlidir.

Örneğin:

__block Person *aPerson = nil;

__block NSString *name = nil;

10

Bloğun dışında her zaman bu değişkenten önce __block belirleyicisini kullanan bir değişken atamak için kodunuzun şöyle olması gerekir: -

__block Person *aPerson = nil;


3

__weakBaşka bir kullanım döngüsüyle ilgili uyarı alırsanız deneyin__block

Person *strongPerson = [Person new];
__weak Person *weakPerson = person;

Artık weakPersonbloğun içindeki nesneyi başvurabilirsiniz .


3

evet blok en çok kullanılan işlevselliktir, bu nedenle tutma döngüsünü önlemek için, bloğun içinde kendilik de dahil olmak üzere güçlü değişkeni kullanmaktan kaçınmalıyız, _weak veya zayıflatır.


0

Aynı hatayı gördüğümde, şu şekilde çözmeye çalıştım:

   __block CGFloat docHeight = 0.0;


    [self evaluateJavaScript:@"document.height" completionHandler:^(id height, NSError *error) {
        //height
        NSLog(@"=========>document.height:@%@",height);
        docHeight = [height floatValue];
    }];

ve iyi çalışıyor

Değişken'in önüne " __block " ekleyin .

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.