IOS 가 병렬 스 레 드 를 만 드 는 인 스 턴 스 상세 설명

4871 단어 IOS병렬 스 레 드
IOS 가 병렬 스 레 드 를 만 드 는 인 스 턴 스 상세 설명
병렬 스 레 드 만 들 기
       메 인 스 레 드 는 일반적으로 UI 인터페이스 와 사용자 의 상호작용 을 처리 합 니 다.다른 일 은 일반적으로 다운로드,계산 등 다른 라인 으로 처리 해 야 한다.
지금 은 3 개의 스 레 드 를 간단하게 만 들 고 각각 1-1000 을 인쇄 합 니 다.편 의 를 위해 스 레 드 3 은 메 인 스 레 드 에 놓 고 실 행 됩 니 다.

- (void) firstCounter{  
@autoreleasepool {  
NSUInteger counter = 0;  
for (counter = 0;  
counter < 1000;  
counter++){  
NSLog(@"First Counter = %lu", (unsigned long)counter);  
}  
}  
}  

- (void) secondCounter{  
@autoreleasepool {  
NSUInteger counter = 0;  
 
for (counter = 0;  
counter < 1000;  
counter++){  
NSLog(@"Second Counter = %lu", (unsigned long)counter);  
}  
}  
}  


- (void) thirdCounter{  
NSUInteger counter = 0;  
for (counter = 0;  
counter < 1000;  
counter++){  
NSLog(@"Third Counter = %lu", (unsigned long)counter);  
}  
}  


- (void)viewDidLoad {  
[super viewDidLoad];  
[NSThread detachNewThreadSelector:@selector(firstCounter)  
toTarget:self  
withObject:nil];  
[NSThread detachNewThreadSelector:@selector(secondCounter)  
toTarget:self  
withObject:nil];  
/* Run this on the main thread */  
[self thirdCounter];  
}  
       thirdCounter 함수 가 단독 스 레 드 에서 실행 되 지 않 았 기 때문에 자동 으로 풀 을 풀 필요 가 없습니다(autorelease pool).이 방법 은 응용 프로그램의 메 인 스 레 드 에서 실 행 됩 니 다.모든 Cocoa Touch 프로그램 이 자동 으로 실 행 됩 니 다.
이 메 인 스 레 드 에 자동 방출 탱크 를 만 듭 니 다.  
       코드 의 마지막 에 detachNewThreadSelector 를 호출 하여 첫 번 째 카운터 와 두 번 째 계산 기 를 독립 된 스 레 드 에서 실행 합 니 다.현재 프로그램 을 실행 하면 콘 솔 창 에서 다음 과 같은 정 보 를 볼 수 있 습 니 다.

 Second Counter = 921 
Third Counter = 301 
Second Counter = 922 
Second Counter = 923 
Second Counter = 924 
First Counter = 956 
Second Counter = 925 
Counter = 957 
Second Counter = 926 
First Counter = 958 
Third Counter = 302 
Second Counter = 927 
Third Counter = 303 
Second Counter = 928
       이 세 개의 타 이 머 는 동시에 작 동 되 고 그들 이 출력 한 내용 은 무 작위 로 교체 되 었 음 을 알 수 있다.모든 스 레 드 는 autorelease pool 을 만들어 야 합 니 다.autorelease pool 이 release 되 기 전에 autorelease pool 은 autorelease 대상 에 대한 인용 을 계속 가지 고 있 습 니 다.인용 메모리 관리 환경 에서 이것 은 매우 중요 한 메커니즘 이다.예 를 들 어 코코아 터치 의 대상 은 autoreleased 될 수 있다.언제든지 대상 인 스 턴 스 를 만 들 때 이 대상 의 인용 수 는 1 이지 만 만 만 만 든 autorelease pool 대상 이 release 되 었 을 때 autorelease 대상 도 release 메 시 지 를 보 냅 니 다.이때 도 인용 계수 가 1 이면 대상 은 삭 제 됩 니 다. 
        모든 스 레 드 는 이 스 레 드 의 첫 번 째 생 성 대상 으로 autorelease pool 을 만들어 야 합 니 다.만약 이렇게 하지 않 는 다 면,이렇게 하지 않 으 면,라인 이 종 료 될 때,라인 에 분 배 된 대상 에 게 메모리 유출 이 발생 할 것 이다.더 잘 이해 하기 위해 서 다음 코드 를 살 펴 보 겠 습 니 다. 

- (void) autoreleaseThread:(id)paramSender{  
NSBundle *mainBundle = [NSBundle mainBundle];  
NSString *filePath = [mainBundle pathForResource:@"AnImage"  
ofType:@"png"];  
UIImage *image = [UIImage imageWithContentsOfFile:filePath];  
/* Do something with the image */  
NSLog(@"Image = %@", image);  
}  
- (void)viewDidLoad {  
[super viewDidLoad];  
[NSThread detachNewThreadSelector:@selector(autoreleaseThread:)  
toTarget:self  
withObject:self];  
}  
         ,,                  :
*** __NSAutoreleaseNoPool(): Object 0x5b2c990 of 
class NSCFString autoreleased with no pool in place - just leaking 
*** __NSAutoreleaseNoPool(): Object 0x5b2ca30 of 
class NSPathStore2 autoreleased with no pool in place - just leaking 
*** __NSAutoreleaseNoPool(): Object 0x5b205c0 of 
class NSPathStore2 autoreleased with no pool in place - just leaking 
*** __NSAutoreleaseNoPool(): Object 0x5b2d650 of 
class UIImage autoreleased with no pool in place - just leaking
      위의 정 보 는 우리 가 만 든 autorelease 의 UIImage 인 스 턴 스 가 메모리 유출 을 일 으 켰 음 을 보 여 줍 니 다.또한 FilePath 와 다른 대상 도 유출 되 었 습 니 다.이것 은 우리 의 스 레 드 에서 시작 할 때 autorelease pool 을 만 들 고 초기 화하 지 않 았 기 때 문 입 니 다.다음은 정확 한 코드 입 니 다.메모리 유출 이 없 는 지 테스트 해 보 세 요.

- (void) autoreleaseThread:(id)paramSender{  
@autoreleasepool {  
NSBundle *mainBundle = [NSBundle mainBundle];  
NSString *filePath = [mainBundle pathForResource:@"AnImage"  
ofType:@"png"];  
UIImage *image = [UIImage imageWithContentsOfFile:filePath];  
/* Do something with the image */  
NSLog(@"Image = %@", image);  
}  
}  
이상 은 IOS 병발 라인 에 관 한 실례 를 사용 합 니 다.의문 이 있 으 시 면 댓 글 을 달 아 토론 하 셔 도 됩 니 다.함께 발전 하 셔 서 감사합니다. 읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기