수색…


통사론

  • // 로컬 변수로 선언 :

    returnType (^ blockName) (parameterType1, parameterType2, ...) = ^ returnType (argument1, argument2, ...) {...};

  • // 속성으로 선언하십시오.

    @property (비 원자, 복사, null 허용) returnType (^ blockName) (parameterTypes);

  • // 메소드 매개 변수로 선언 :

    - (void) someMethodThatTakesABlock : (returnType (^ nullability) (parameterTypes)) blockName;

  • // 메소드 호출에 대한 인자로 선언 :

    [someObject someMethodThatTakesABlock : ^ returnType (parameters) {...}];

  • // typedef로 선언하십시오.

    typedef returnType (^ TypeName) (parameterTypes);

    TypeName blockName = ^ returnType (매개 변수) {...};

  • // C 함수를 선언하여 블록 객체를 반환합니다.

    BLOCK_RETURN_TYPE (^ function_name (함수 매개 변수)) (BLOCK_PARAMETER_TYPE);

비고

블록은 C, Objective-C, C ++ 및 Objective-C ++의 블록 언어 지정에서 지정합니다.

또한 Block ABI는 Block Implementation Specification에 의해 정의됩니다.

메서드 매개 변수로 블록

- (void)methodWithBlock:(returnType (^)(paramType1, paramType2, ...))name;

정의 및 지정

변수 addition 할당 된 두 개의 배정도 숫자를 더하는 블록 :

double (^addition)(double, double) = ^double(double first, double second){
    return first + second;
};

다음과 같이 블록을 호출 할 수 있습니다.

double result = addition(1.0, 2.0); // result == 3.0

속성으로 차단

@interface MyObject : MySuperclass

@property (copy) void (^blockProperty)(NSString *string);

@end

할당 할 때 selfblockProperty 유지하므로 블록에는 self에 대한 강력한 참조가 없어야합니다. 그 상호 강한 참조는 "유지주기"라고하며 두 객체 중 하나가 해제되지 않도록합니다.

__weak __typeof(self) weakSelf = self;
self.blockProperty = ^(NSString *string) {
    // refer only to weakSelf here.  self will cause a retain cycle
};

가능성은 희박하지만, 실행 중에 어딘가에서 블록 self 내에서 self 할당이 해제 될 수 있습니다. 이 경우 weakSelfnil 되고 모든 메시지에 원하는 효과가 없습니다. 이로 인해 앱이 알 수없는 상태가 될 수 있습니다. 이것은 블록 실행 중에 __strong ivar로 weakSelf 를 유지하고 이후에 정리하면 피할 수 있습니다.

__weak __typeof(self) weakSelf = self;
self.blockProperty = ^(NSString *string) {
    __strong __typeof(weakSelf) strongSelf = weakSelf;
    // refer only to strongSelf here.
    // ...
    // At the end of execution, clean up the reference
    strongSelf = nil;
};

유형 정의 차단

typedef double (^Operation)(double first, double second);

블록 유형을 typedef로 선언하면 인수 및 반환 값에 대한 전체 설명 대신 새 유형 이름을 사용할 수 있습니다. 이것은 Operation 을 두 개의 double을 취하고 double을 반환하는 블록으로 정의합니다.

유형은 메소드의 매개 변수로 사용될 수 있습니다.

- (double)doWithOperation:(Operation)operation 
                    first:(double)first 
                   second:(double)second;

또는 변수 유형으로 :

Operation addition = ^double(double first, double second){
    return first + second;
};

// Returns 3.0
[self doWithOperation:addition
                first:1.0
               second:2.0];

typedef가 없으면 이것은 훨씬 더 복잡합니다.

- (double)doWithOperation:(double (^)(double, double))operation
                    first:(double)first
                   second:(double)second;

double (^addition)(double, double) = // ...

로컬 변수로 차단

returnType (^blockName)(parameterType1, parameterType2, ...) = ^returnType(argument1, argument2, ...) {...};    

float (^square)(float) = ^(float x) {return x*x;};

square(5); // resolves to 25
square(-7); // resolves to 49

다음은 반환 값이없고 매개 변수가없는 예입니다.

NSMutableDictionary *localStatus;
void (^logStatus)() = ^(void){ [MYUniversalLogger logCurrentStatus:localStatus]};

// Insert some code to add useful status information
// to localStatus dictionary 

logStatus(); // this will call the block with the current localStatus


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow