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;

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


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.


18

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

Sebagai contoh:

__block Person *aPerson = nil;

__block NSString *name = nil;

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;


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.


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.