Object - C: Block 의 실현 방식
Date : 2015-12-4
선언: 블록 을 패키지 함수 로 사용 할 수 있 습 니 다. 외부 변수 와 부분 변수 에 접근 할 수 있 지만 기본적으로 외부 변 수 를 수정 할 수 없습니다.대리 (Delegate) 를 사용 하 는 것 보다 직관 적 으로 그것 을 사용 할 수 있다.그 나 저 나 애플 의 많은 인터페이스 (API) 는 Block 을 사용 했다.
1. Block 의 기본 정의
Block 의 기본 표기 법 (상세 표기 법):
returnType (^blockName)(params) = ^returnType(params) {
// code...
};
중국어 재해 석: 반환 형식 (^ Block 의 이름) (Block 의 인자) = ^ 반환 형식 (Block 의 인자) {여기에 코드 를 넣 습 니 다}, 예:
int (^myBlock)(int num1, int num2) = ^int(int num1, int num2){
return 100;
};
Block 이 형식 과 인 자 를 되 돌려 주지 않 아 도 된다 면 다음 과 같이 간략하게 쓸 수 있 습 니 다.
void (^myBlock2)() = ^(){
};
혹시
void (^myBlock2)(void) = ^void(void){
};
형식 이나 인 자 를 되 돌려 줍 니 다. 없 으 면 'void' 로 대체 할 수 있 습 니 다.
너 도 오른쪽 과 같은 번호, ^ 후의 () 를 삭제 할 수 있다. 즉:
void (^myBlock2)() = ^{
};
이렇게 하면 깔끔 하지 않 아 요?
당신 도 먼저 Block 함 수 를 정의 할 수 있 지만 함수 의 실현 을 쓰 지 않 습 니 다. 우 리 는 뒤에서 구체 적 인 함수 의 실현 을 쓸 수 있 습 니 다. 이렇게:
void (^myBlock2)(void);
myBlock2 = ^{
};
2. Block 을 방법 으로 정의 합 니 다.
Block 을 방법 에 정의 합 니 다. 위 와 달리 Block 의 이름 은 성명 할 때 쓰 지 않 고 뒤에 쓰 십시오. 이렇게:
- (void)getWtihBlock:(void (^)())block
{
// code...
// block
block();
}
사용 방법:
[self getWtihBlock:^{
NSLog(@"sdf");
}];
다음은 상세 한 예 를 들 어 설명 을 썼 다.
/**
* N (
)
*
* @param string
* @param count
* @param stringBlock Block, str
*/
// Block , Block
// IOS API Block, UIView
- (void)getStrWithString:(NSString *)string
CopyCount:(int)count
resultString:(void (^)(NSString *str))stringBlock
{
NSMutableString *newString = [NSMutableString stringWithString:string];
for (NSUInteger i = 0; i < count; i++) {
NSUInteger len = [string length];
NSString *insertString = [NSString stringWithFormat:@"
%@", string];
[newString insertString:insertString atIndex:len];
}
// block, newString
stringBlock(newString);
}
용법 도 마찬가지다.
BlockObject *block = [[BlockObject alloc] init];
[block getStrWithString:@"Garvey"
CopyCount:3
resultString:^(NSString *str) {
// str
NSLog(@"str is %@", str);
}];
가끔 복잡 한 Block 문법 은 함수 의 성명 을 읽 기 어렵 게 하기 때문에 type: def 를 사용 하여 Block 에 새로운 유형 을 만 듭 니 다.
typedef void (^ResultBlock)(NSString *str);
방법 을 정의 할 때:
- (void)getStrWithString2:(NSString *)string
CopyCount:(int)count
resultString:(ResultBlock)stringBlock;
type: def 앞 뒤 를 비교 해 봅 시다.
//
- (void)getStrWithString:(NSString *)string
CopyCount:(int)count
resultString:(void (^)(NSString *str))stringBlock;
//
- (void)getStrWithString2:(NSString *)string
CopyCount:(int)count
resultString:(ResultBlock)stringBlock;
주의: 사용 방법 은 같 습 니 다. 다만 정의 가 간단 해 졌 을 뿐 입 니 다.
프 록 시 (Delegate) 를 계속 사용 하여 방법 을 바 꾸 고 있다 면, 이 제 는 Block 을 사용 해 보 세 요.
박문 작가: Garvey Calvin
박문 출처:http://www.cnblogs.com/GarveyCalvin/
본 논문 의 저작권 은 작가 와 블 로그 원 에 공유 되 어 있 습 니 다. 전 재 를 환영 하지만 이 성명 을 보류 하고 원문 링크 를 제시 해 야 합 니 다. 합작 해 주 셔 서 감사합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.