Tetapkan variabel di dalam Blok ke variabel di luar Blok

382

Saya mendapatkan kesalahan

Variabel tidak dapat ditentukan (tidak ada __block type specifier)

di telepon aPerson = participant;. Bagaimana saya bisa memastikan blok dapat mengakses aPersonvariabel dan aPersonvariabel dapat dikembalikan?

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;
tommi
sumber

Jawaban:

780

Anda perlu menggunakan baris kode ini untuk menyelesaikan masalah Anda:

__block Person *aPerson = nil;

Untuk detail lebih lanjut, silakan merujuk ke tutorial ini: Blok dan Variabel

Devarshi
sumber
101
Harap perhatikan bahwa __blockdiawali dengan dua garis bawah.
Eric Brotto
12
menggunakan __blockkesalahan saya hilang, tetapi nilai tidak mempertahankan blok. Bantuan apa pun di sini
User16119012
7
Blok disebut setelah di mana ia seharusnya disebut, dengan kata lain, blok tidak berjalan 'segera'.
Tom Andersen
1
Jika blok tidak berjalan dengan BENAR, maka ini seharusnya tidak diterima sebagai jawaban yang membuatnya menjadi pemecah masalah besar.
durazno
3
Jawaban ini benar sehubungan dengan pertanyaan yang diposting, jangan ragu untuk mengirim pertanyaan lain jika Anda memiliki skenario yang berbeda.
Devarshi
40

Hanya pengingat akan kesalahan yang saya buat sendiri juga, the

 __block

deklarasi harus dilakukan ketika pertama kali mendeklarasikan variabel, yaitu, DI LUAR blok, bukan di dalamnya. Ini harus menyelesaikan masalah yang disebutkan dalam komentar tentang variabel tidak mempertahankan nilainya di luar blok.

Denis Balko
sumber
18

Cukup gunakan __blockawalan untuk mendeklarasikan dan menetapkan segala jenis variabel di dalam blok.

Sebagai contoh:

__block Person *aPerson = nil;

__block NSString *name = nil;
Umesh Sawant
sumber
10

Untuk menetapkan variabel di dalam blok yang di luar blok selalu menggunakan __block specifier sebelum variabel itu kode Anda harus seperti ini: -

__block Person *aPerson = nil;
Gaurav
sumber
10
__block Person *aPerson = nil;
Ketan Patel
sumber
3

Coba __weakjika Anda mendapat peringatan tentang mempertahankan siklus penggunaan lain__block

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

Sekarang Anda dapat merujuk weakPersonobjek di dalam blok.

PradeepKN
sumber
3

ya blok adalah fungsi yang paling sering digunakan, jadi untuk menghindari siklus retain kita harus menghindari menggunakan variabel kuat, termasuk diri di dalam blok, meskipun menggunakan _weak atau diri kita sendiri.

pengguna6311313
sumber
0

Ketika saya melihat kesalahan yang sama, saya mencoba menyelesaikannya seperti:

   __block CGFloat docHeight = 0.0;


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

dan itu bekerja dengan baik

Cukup tambahkan " __block " sebelum Variable.

Mr.Javed Multani
sumber