블록 내부의 변수를 블록 외부의 변수에 지정


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

yes 블록이 가장 많이 사용되는 기능이므로, 유지주기를 피하려면 블록 내부의 self를 포함하여 _weak 또는 weakself를 사용하더라도 강력한 변수를 사용하지 않아야합니다.


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.