Gán một biến trong Khối cho một biến bên ngoài Khối


382

Tôi đang gặp lỗi

Biến không được gán (thiếu chỉ định loại __block)

trên dòng aPerson = participant;. Làm thế nào tôi có thể chắc chắn rằng khối có thể truy cập vào aPersonbiến và aPersonbiến có thể được trả về?

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;

Câu trả lời:


780

Bạn cần sử dụng dòng mã này để giải quyết vấn đề của mình:

__block Person *aPerson = nil;

Để biết thêm chi tiết, vui lòng tham khảo hướng dẫn này: Khối và Biến


101
Xin lưu ý rằng __blockcó tiền tố với hai dấu gạch dưới.
Eric Brotto

12
sử dụng __blocklỗi của tôi đã biến mất, nhưng giá trị không được giữ lại khỏi khối. Mọi sự giúp đỡ ở đây
User16119012 24/214

7
Khối được gọi tốt sau khi có vẻ như nó được gọi, nói cách khác, các khối không chạy 'ngay lập tức'.
Tom Andersen

1
Nếu các khối không chạy RIGHT AWAY thì điều này không được chấp nhận câu trả lời vì điều đó làm cho nó trở thành một công cụ giảm giá lớn.
durazno

3
Câu trả lời này là chính xác đối với câu hỏi được đăng, vui lòng gửi câu hỏi khác nếu bạn có một kịch bản khác trong tâm trí.
Devarshi

40

Chỉ là một lời nhắc nhở về một sai lầm tôi cũng đã làm cho mình,

 __block

khai báo phải được thực hiện khi lần đầu tiên khai báo biến, nghĩa là BÊN NGOÀI của khối, không phải bên trong nó. Điều này sẽ giải quyết các vấn đề được đề cập trong các ý kiến ​​về biến không giữ lại giá trị của nó bên ngoài khối.


18

Chỉ cần sử dụng __blocktiền tố để khai báo và gán bất kỳ loại biến nào trong một khối.

Ví dụ:

__block Person *aPerson = nil;

__block NSString *name = nil;

10

Để gán một biến bên trong khối mà bên ngoài khối luôn sử dụng __block specifier trước biến đó, mã của bạn phải như thế này: -

__block Person *aPerson = nil;


3

Hãy thử __weaknếu bạn nhận được bất kỳ cảnh báo nào liên quan đến việc giữ lại chu kỳ sử dụng khác__block

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

Bây giờ bạn có thể tham chiếu weakPersonđối tượng bên trong khối.


3

khối có là chức năng được sử dụng nhiều nhất, vì vậy để tránh chu kỳ giữ lại, chúng ta nên tránh sử dụng biến mạnh, bao gồm cả bản thân bên trong khối, kiểm tra sử dụng _weak hoặc yếu.


0

Khi tôi thấy lỗi tương tự, tôi đã cố gắng giải quyết nó như sau:

   __block CGFloat docHeight = 0.0;


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

và nó hoạt động tốt

Chỉ cần thêm " __block " trước Biến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.