OC 의 block 저장 위치

3935 단어 block
아래 의 모든 것 은 ARC 상황 에서:
1. block 블록의 저장 위치 (block 블록 입구 주소): 코드 구역, 쌓 기 구역 (프로그램 은 5 개 구역 으로 나 뉘 며 상수 구역, 전역 구역 과 스 택 구역 이 있 을 수 있 습 니 다. MRC 상황 에서 코드 는 스 택 구역 이 존재 할 수 있 습 니 다. 파 티 션 에 대한 자세 한 참고:http://www.cnblogs.com/mddblog/p/4405165.html).
상세 한 소개:
상황 1: 코드 영역
    스 택 에 있 는 변수 (예 를 들 어 부분 변수) 에 접근 하지 않 고 쌓 여 있 는 변수 (예 를 들 어 alloc 가 만 든 대상) 에 접근 하지 않 습 니 다.전역 변수 에 접근 해도 된다 는 얘 기다.
/**
          
 */
int main(int argc, char * argv[]) {
    void (^block)(void) = ^{
        NSLog(@"===");
    };
    block();
}
/**
       (  )  
 */
int  iVar = 10;
int main(int argc, char * argv[]) {
    void (^block)(void) = ^{
        NSLog(@"===%d",iVar);
    };
    block();
}

 
상황 2: 퇴적 구역
    스 택 에 있 는 변수 (예 를 들 어 부분 변수) 나 스 택 에 있 는 변수 (예 를 들 어 alloc 가 만 든 대상) 에 접근 했다 면.쌓 여 있 는 곳 에 보관 합 니 다.(실제 스 택 에 두 었 다가 ARC 상황 에서 자동 으로 스 택 에 복사 합 니 다)
/**
        
 */
int main(int argc, char * argv[]) {
    int iVar = 10;
    void (^block)(void) = ^{
        NSLog(@"===%d",iVar);
    };
    block();
}

 
2. 코드 를 쌓 아 올 리 는 구역 에 저장 할 때 특별한 주의 가 필요 합 니 다. 쌓 아 올 리 는 구역 은 코드 구역 과 달리 변화 가 없 기 때문에 쌓 아 올 리 는 구역 은 계속 변화 합 니 다 (계속 만 들 고 소각 합 니 다).따라서 코드 가 삭 제 될 수 있 습 니 다.따라서 이러한 상황 에 대해 저 희 는 block 속성 을 정의 할 때 strong 또는 copy 로 지정 해 야 합 니 다.
@property (nonatomic, strong) void (^myBlock)(void);//이렇게 하면 강 한 지침 이 그것 을 가리 키 고 있다.
@property (nonatomic, copy)  void (^myBlock)(void);  //쌓 인 구역 에 copy 한 부 를 넣 지 않 습 니 다. 이 유 는 세 가지 입 니 다.
첫 번 째 상황 (코드 에 코드 구역 이 존재 함) 에 대해 서 는 strong, copy (한 부 를 쌓 아 올 리 지 않 음) 를 사용 하 셔 도 됩 니 다.따라서 block 을 정의 할 때 strong (추천) 이나 copy 로 지정 하 는 것 이 좋 습 니 다.
3. copy 로 지정 한 후 복사 할 수 있 습 니까?(혹은 얕 은 복사 인지 깊 은 복사 인지)
        1 copy 가 변 변수: 할당 포인터 와 함께 포인터 가 가리 키 는 메모리 영역 도 복사 합 니 다.NSMutablestring 대상 과 같은 깊 은 복사.
        2 copy 불 가 변 변수: strong 과 같 습 니까? 아니면 얕 은 복사 입 니까? 예 를 들 어 NSString 대상 입 니까?
    block 은 코드, 즉 가 변 적 이지 않 기 때문에 깊이 복사 하지 않 습 니 다.

좋은 웹페이지 즐겨찾기