Objective-c의 Block

2155 단어 Objective-C

블락의 문법은 더 이상 군말하지 않고 다른 것들을 알아보자.
 
1. 블록의 저장 영역
Block은 실제적으로 OC 대상이다. 그의 저장 영역에 따라 Block을 세 가지 상황으로 나눌 수 있다. 하나는 데이터 영역이 존재하는 것이고, 하나는 쌓여 있는 것이고, 하나는 창고에 존재하는 것이다.창고에 있는 Block 대상은 역할 영역이 끝난 후에 바로 방출됩니다. 이 Block 대상을 저장하려면copy 방법을 사용해야 합니다.데이터 영역의 Block에서 자주 사용되지 않는 것을 발견하고 다시 소개하지 않습니다.일부 경우, 우리가 표시하지 않고 코피 방법을 호출하면, Block은 자동으로 Block을 더미에 복사합니다. 예를 들어:
 
Block을 반환값으로 되돌려줍니다.
Block을 에 복사strong 코스메틱의 id 유형 변수 또는 블록 유형 변수입니다.
코코아 프레임워크의 방법에서 함수 서명은 usingBlock의
GCD
 
2. Block 포획 대상
코드 보기
 
- (blk_t)createBlock
{
    blk_t blk;
    NSMutableArray *array = [[NSMutableArray alloc]init];

    blk = ^(id obj){
        [array addObject:obj];
        NSLog(@"%d",array.count);
    };
    return blk;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    blk_t blk = [self createBlock];
    blk(@"sd");
    blk(@"sd");
    blk(@"sd");
    
    
    return YES;
}

실행 결과
 
 
2014-01-01 20:05:43.012 GCDDemo[7765:70b] 1
2014-01-01 20:05:43.012 GCDDemo[7765:70b] 2
2014-01-01 20:05:43.013 GCDDemo[7765:70b] 3

 
 
blk는 반환값으로 더미에 복사되었고 blk는array를 캡처했기 때문에array 작용역이 끝났음에도 불구하고array는 방출되지 않았습니다. 우리는 이 변수를 사용할 수 있습니다.
 
3. Block의 순환 인용
 
@interface Test: NSObject
{
    blk_t blk;
}

...
 
 blk = ^(id obj){
        NSLog(@"%@",self);
    };

이렇게 하면 순환 인용을 일으키는데 해결 방안은
 
제1종
 
id __weak tmp = self;
blk = ^(id obj){
        
        NSLog(@"%@",tmp);
    };

두 번째
 
 
 __block id tmp = self;
 blk = ^(id obj){
       
        NSLog(@"%@",tmp);
tmp = nil;
    };

단점은 이 Block을 실행해야 한다는 것입니다. 그렇지 않으면 순환 인용을 일으킬 수 있습니다.

좋은 웹페이지 즐겨찾기