Objective-C Language
블록
수색…
통사론
// 로컬 변수로 선언 :
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
할당 할 때 self
는 blockProperty
유지하므로 블록에는 self에 대한 강력한 참조가 없어야합니다. 그 상호 강한 참조는 "유지주기"라고하며 두 객체 중 하나가 해제되지 않도록합니다.
__weak __typeof(self) weakSelf = self;
self.blockProperty = ^(NSString *string) {
// refer only to weakSelf here. self will cause a retain cycle
};
가능성은 희박하지만, 실행 중에 어딘가에서 블록 self
내에서 self
할당이 해제 될 수 있습니다. 이 경우 weakSelf
는 nil
되고 모든 메시지에 원하는 효과가 없습니다. 이로 인해 앱이 알 수없는 상태가 될 수 있습니다. 이것은 블록 실행 중에 __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