성능 최적화 - autorelease 사용 문제

3236 단어 성능 최적화
MRR에서 방출된 대상은release 또는 autorelease 메시지를 통해 이루어진다.release 메시지는 인용 계수 -1을 즉시 방출한다.autorelease 메시지를 보내면 대상이 메모리 방출 탱크에 넣는 것을 지연시킨다. 대상의 인용 계수는 진정으로 변화하지 않고 메모리 방출 탱크에 기록을 추가한다. 탱크가 소각되기 전에 모든 대상에게 release 메시지를 보내면 인용 계수가 감소할 것이다.
대상의 방출을 지연시킬 수 있기 때문에 반드시 필요하지 않으면 autorelease 방출 대상을 사용하지 마십시오. iOS 프로그램에서 기본 메모리 방출 탱크의 방출은 프로그램이 끝나고 프로그램 입구main.m 파일 코드는 다음과 같습니다.
int main(int argc, char *argv[])



{



@autoreleasepool {



return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));



}



}

 
코드는 @autoreleasepool {...} 사이에 감싸여 있습니다. 이것은 풀의 작용 범위이며, 기본값은 전체 응용 프로그램입니다.대량의 대상이 autorelease로 방출되면 메모리 유출도 발생할 수 있습니다.그럼 언제 autorelease가 필수인가요?다음 코드를 살펴보겠습니다.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath



{



static NSString *CellIdentifier = @”CellIdentifier”;



UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];



if (cell == nil) {



cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];



}



NSUInteger row = [indexPath row];



NSDictionary *rowDict = [self.listTeams objectAtIndex:row];



cell.textLabel.text =  [rowDict objectForKey:@"name"];



NSString *imagePath = [rowDict objectForKey:@"image"];



imagePath = [imagePath stringByAppendingString:@".png"];



cell.imageView.image = [UIImage imageNamed:imagePath];



cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;



return cell;



}

 
 
그 중cell 대상은 바로release가 될 수 없습니다. 테이블 보기 화면을 설정해야 합니다.autorelease는 일반적으로 다른 호출자에게 대상을 제공하는 방법에 적용되며, 대상은 이 방법에서 즉시release를 제공할 수 없으며, 방출을 지연시켜야 한다.
그 밖에 autorelease, 즉 앞에서 언급한'클래스 구조 방법'을 사용한 경우도 있다.
NSString *message = [NSString string WithFormat:@ ""%@ 팀을 선택했습니다."",rowValue];
이 대상의 소유권은 현재 호출자는 아니지만 iOS시스템이 autorelease 메시지를 보내서 풀에 넣는 것이다. 물론 이 모든 것은 개발자에게 보이지 않기 때문에 우리는 이런 문장의 사용을 줄이는 데 주의해야 한다.

좋은 웹페이지 즐겨찾기