กำหนดตัวแปรภายในบล็อกให้กับตัวแปรภายนอกบล็อก


381

ฉันได้รับข้อผิดพลาด

ตัวแปรไม่สามารถกำหนดได้ (ตัวระบุประเภท __block หายไป)

aPerson = participant;บนเส้น ฉันจะแน่ใจได้อย่างไรว่าบล็อกสามารถเข้าถึงaPersonตัวแปรและaPersonสามารถส่งคืนตัวแปรได้

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;

คำตอบ:


779

คุณต้องใช้รหัสบรรทัดนี้เพื่อแก้ไขปัญหาของคุณ:

__block Person *aPerson = nil;

สำหรับรายละเอียดเพิ่มเติมโปรดอ้างอิงบทช่วยสอนนี้: บล็อกและตัวแปร


101
โปรดทราบว่า__blockนำหน้าด้วยขีดล่างสองอัน
Eric Brotto

12
ใช้__blockข้อผิดพลาดของฉันไปแล้ว แต่ค่าไม่ได้ถูกบล็อกไว้ ความช่วยเหลือที่นี่
User16119012

7
บล็อกถูกเรียกอย่างดีหลังจากที่ดูเหมือนว่าควรเรียกอีกนัยหนึ่งบล็อกไม่ได้เรียกใช้ 'ทันที'
Tom Andersen

1
หากบล็อกไม่รัน RIGHT AWAY ก็ไม่ควรยอมรับคำตอบนี้เพราะมันเป็นตัวทำลายข้อตกลงขนาดใหญ่
durazno

3
คำตอบนี้ถูกต้องเกี่ยวกับคำถามที่โพสต์อย่าลังเลที่จะโพสต์คำถามอื่นหากคุณมีสถานการณ์ที่แตกต่างในใจ
Devarshi

40

เพียงเตือนความจำฉันทำเองเกินไป

 __block

การประกาศจะต้องทำเมื่อมีการประกาศตัวแปรครั้งแรกนั่นคือนอกของบล็อกไม่ใช่ภายในของมัน สิ่งนี้ควรแก้ไขปัญหาที่กล่าวถึงในความคิดเห็นเกี่ยวกับตัวแปรที่ไม่เก็บค่าไว้นอกบล็อก


18

เพียงใช้__blockคำนำหน้าเพื่อประกาศและกำหนดตัวแปรประเภทใดก็ได้ภายในบล็อก

ตัวอย่างเช่น:

__block Person *aPerson = nil;

__block NSString *name = nil;

10

ในการกำหนดตัวแปรภายในบล็อกที่ด้านนอกของบล็อกใช้ตัวระบุ __block เสมอก่อนที่ตัวแปรนั้นรหัสของคุณควรเป็นดังนี้: -

__block Person *aPerson = nil;


3

ลอง__weakถ้าคุณได้รับคำเตือนใด ๆ เกี่ยวกับการรักษาวงจรอื่นใช้__block

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

ตอนนี้คุณสามารถอ้างอิงweakPersonวัตถุภายในบล็อก


3

ใช่บล็อกเป็นฟังก์ชั่นที่ใช้มากที่สุดดังนั้นเพื่อหลีกเลี่ยงวงจรการเก็บข้อมูลเราควรหลีกเลี่ยงการใช้ตัวแปรที่แข็งแกร่งรวมถึงตัวเองภายในบล็อกตรวจสอบการใช้ _weak หรืออ่อนแอเอง


0

เมื่อฉันเห็นข้อผิดพลาดเดียวกันฉันพยายามแก้ไขเช่น:

   __block CGFloat docHeight = 0.0;


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

และมันทำงานได้ดี

เพียงเพิ่ม " __block " หน้าตัวแปร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.