2011-11-01 37 views
347

Tôi nhận được một lỗiGán một biến bên trong một khối cho một biến bên ngoài một khối

Biến không thể chuyển nhượng (thiếu loại __block specifier) ​​

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 biến số aPerson và biến số aPerson có thể được trả lại?

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; 

Trả lời

699

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

__block Person *aPerson = nil; 

Để biết thêm chi tiết, vui lòng tham khảo hướng dẫn này: Blocks and Variables

+95

Xin lưu ý rằng '__block' được bắt đầu bằng ** hai ** dấu gạch dưới. –

+9

bằng cách sử dụng '__block' lỗi của tôi biến mất, nhưng giá trị không được giữ lại khỏi khối. Bất kỳ sự giúp đỡ nào ở đây – User16119012

+7

Khối được gọi là tốt sau khi nó trông giống như nó nên được gọi, nói cách khác, các khối không chạy 'ngay lập tức'. –

10

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

__block Person *aPerson = nil; 
16

Chỉ cần sử dụng tiền tố __block để 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; 
30

Chỉ cần một lời nhắc nhở về một sai lầm tôi đã thực hiện bản thân mình cũng vậy, việc kê khai

__block 

phải được thực hiện khi lần đầu tiên tuyên bố thay đổi, có nghĩa là, ngoài 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.

9
__block Person *aPerson = nil; 
2

Hãy thử __weak nếu bạn nhận được bất kỳ cảnh báo liên quan đến duy trì chu kỳ khác sử dụng __block

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

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

3

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

Các vấn đề liên quan