[iOS7의 일부 요약] 14, 블락의 개념과 응용

2747 단어 Objective-Cblockios7
우리는 서로 다른 대상 간의 통신 방법이 비교적 자주 사용하는 방법으로는 에이전트(delegate), 알림 센터(Notification Center) 등이 있다는 것을 안다.블록은 또 다른 대상 간의 통신 방법이다.그 중에서delegate와block과 관련된 두 대상은 일대일 관계이고 알림센터가 반영하는 것은 일대다 관계이다. 이런 방법을 통해 대상 간의 결합(기능은 관련되지만 계승과 파생 관계는 없다)을 실현했다.
1. 소개
Block은 ios 4.0 이후에 추가되어 새로운 ios api에 대량으로 사용됩니다.Block은 익명의 코드 블록으로 다른 대상에게 전달되는 매개 변수로 되돌아오는 값을 얻을 수 있습니다.본질적으로 볼 때 Block은 다른 일반적인 변수와 유사하지만 저장된 데이터는 함수체일 뿐이다.블록은 Objective-C에 대한 특허가 아니라 C, C++, OBjective-C에 적용될 수 있는 언어 차원의 새로운 기능이다.Block을 사용하면 개발자는 코드 세그먼트를 하나의 수치처럼 매개 변수로 함수에 전달할 수 있습니다.또한 Blocks는 Objective-C의 한 대상이기도 하며, NSArray나 NSDictionary 등의 집합에 다른 대상처럼 추가할 수 있다.
2. 사용 방법
(1) Block을 선언합니다.
//  Block    
  int  (^myBlocks)(int);

(2) Block을 만듭니다.
myBlocks = ^(int a)
{
  int result = a * a;
  return result;
}

(3) Block 호출:
int ret = myBlocks(10);

C/C++에 익숙한 TX는 ios의 Block 메커니즘이 전자의 함수 포인터라는 개념과 매우 유사하다는 느낌을 받을 수 있다.
(4) 성명 블록의 유형: typedef를 이용하여 블록의 정의와 실현을 간소화하고 특히 같은 형식에 여러 블록을 정의할 때 더욱 뚜렷하다.
typedef int (^myBlocks) (int);
MyBlocks myBlock = ^(int a)
{
  int result = a*a;
  return result;
}

3. Block을 함수로 하는 매개 변수:
Block을 함수의 매개 변수로 전달함으로써 리셋 함수와 유사한 기능을 실현할 수 있다.
.....
 
4. 블록의 변수
블록에서 전역 변수와 국부 변수를 사용할 수 있어 양자에 대한 처리가 다르다.block에서 국부 변수를 인용할 때 이 변수를 코드 블록에 상수로 인코딩합니다.Block에서 수정하려면 을 사용해야 합니다Block 수식.예:
//========== ==========
int number = 10;
myBlock = ^(int a)
{
  number = 20;//number , 。
  NSLog("%@",number);
}
//========== ==========
__block int number = 10;
myBlock = ^(int a)
{
  number = 20;//__block block 
  NSLog("%@",number);
}

5. 블록의 메모리 관리
Block 내부에서 인용된 대상에 대해Block도 관건이다.Block 내부에서 일부 대상을 인용하면 그 대상의 인용 계수는 +1입니다.除非该对象由__Block 수식, 인용 계수는 변하지 않습니다.이렇게 하는 주요 원인은 Block의 코드가 실행 지연과 자주 관련되기 때문에 ios는 Block 내부에 관련된 대상을retain으로 진행하여 Block의 코드가 실행되기 전에 그 대상이 방출되는 것을 방지한다.
Block에 대한 메모리 관리는 보통copy와release 방법을 사용할 수 있습니다.창설 초기에 Block의 메모리는 창고에 분배되고, 코피는 더미로 이동합니다.
Block을 실현할 때self에 대한 강한 순환 인용을 피합니다. 간단하게 말하면 하나의 클래스가 Block을property로 포함한다면 이 Block의copy 속성은self가 Block에 대한 강한 인용이라고 볼 수 있고, 하나의 Block이 내부에 호출된 변수는 대상과 마찬가지로 강한 인용 관계가 존재한다고 볼 수 있습니다.그러면 Block이 실행될 때 self 방법을 사용하면 self와 Block의 강력한 순환 인용을 초래하여 메모리를 방출할 수 없습니다.이러한 상황을 피하기 위해 Block 내부에서self를 호출할 때weak 수식된self 던전, 그리고 이 던전으로self를 호출하는 방법은 다음과 같다.
- (void)configureBlock {
    XYZBlockKeeper * __weak weakSelf = self;
    self.block = ^{
        [weakSelf doSomething];   // capture the weak reference
  }
}

상기 Block의 주요 역할을 제외하고 Block을 사용하여 집합류의 매거 조작을 간소화하고 병행 임무를 간소화할 수 있다. 상세한 것은 공식 문서를 참조한다.

좋은 웹페이지 즐겨찾기