OC 의 block 저장 위치
3935 단어 block
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 은 코드, 즉 가 변 적 이지 않 기 때문에 깊이 복사 하지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
3. CSS 기본 프로퍼티프로퍼티 프로퍼티 값으로 테두리 두께 지정 가능 width/height 프로퍼티 max-width/max-height 프로퍼티 margin/padding 프로퍼티 margin 또는 padding 프로퍼티에 윗쪽, 오...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.