2012-07-25 9 views
1

거의 비슷하지만 크기가 작은 다음 두 가지 시나리오에 대해 알려주십시오.Xcode를 사용하여 루프에서 객체를 올바르게 처리하는 방법

시나리오 1 : 모든위한 내가 ARC 위의 거대한 루프를하고 아무 의미가 없습니다에 설정되어 있기 때문에 내가 말되었다

NSString *iAmAstring; 
for(int i = 0; i < 100000;i++) 
{ 
    NSLog(@"INT VALUE: %d", i); 
    iAmAstring = [NSString stringWithFormat:@"%d", i]; 
    NSLog(@"STRING VALUE: %@", iAmAstring); 
} 

과 내부 :

다음 코드에서

루프를 실행하고 난 문자열 포인터를 할당하고 initialising입니다. 나는 너무 작고 중요하지 않으므로 ARC가 처리 할 수 ​​있습니다. 그러나 더 큰 물건으로는하지 마라. 나는 원래 C# 배경에서이고 null의 루프 끝에서 내 문자열을 설정하는 데 익숙하다. 그러나 루프의 끝에서 ARC가 불만을 제기 할 수는 없다. 여기에 nil으로 설정하면 내가 들었다. 루프의 끝 나는 ARC를위한 더 많은 작업을 만들고있을 것이고 나는 정말로 일을 제대로하지 않고 좀비 코드를 작성하고 있습니다. 루프가 끝날 때 ARC가 ON으로 설정되어있는 메모리 크기 (작게는 내가 선호하는 문자열)가 작은 거대한 루프에서 할당하는 객체에 대해 수행 할 작업을 명확히 할 수 있습니까?

시나리오 2 :

상기와 동일하지만 위의 사용 지금있는 NSString 그게 지금 크기가 큰 다른 목적은 가정합니다. 여기에 분명히 &을 루프 전에 초기화 한 다음 루프를 설정하여 루프에서 사용하지만, 루프의 끝에서 좀 더 자유롭게하기 위해 어떻게해야할까요? 다시 ARC가 켜져 있습니까?

미리 감사드립니다.

답변

4

ARC에서는 @autoreleasepool {} 블록으로 자동 풀 풀을 정의합니다. 이 블록은 autoreleased 오브젝트의 새로운 풀을 생성하고 블록 범위가 끝나면 배수시킵니다.

NSString *iAmAstring; 
for(int i = 0; i < 100000;i++) 
{ 
    @autoreleasepool { 
     NSLog(@"INT VALUE: %d", i); 
     iAmAstring = [NSString stringWithFormat:@"%d", i]; 
     NSLog(@"STRING VALUE: %@", iAmAstring); 
    } 
} 

이렇게하면 자동 해제 풀이 고갈되고 루프의 반복마다 자동 복구 된 모든 객체가 해제됩니다. 이것은 작은 문자열로하는 것은 낭비이지만 큰 개체의 경우 큰 도움이 될 수 있습니다.

autorelease가 작동하는 방법에 대한 간단한 참고 사항 : 풀을 비울 때 release에 개체를 한 번 추가로 추가하면됩니다. 기본 풀은 이벤트 루프에서 유출됩니다 (즉, 메소드 종료 후 어느 정도 시간이 지났음). @autoreleasepool의 범위가 끝나면 수동으로 생성 한 풀이 비워집니다.

나는 C#을 배경 출신이고 나는 당신이 재 사용하여 나중에 변수를하지 않는 한

를 null로 루프의 끝에서 심지어 내 캐릭터 라인을 설정하는 데 사용하고,이 완벽하게 쓸모 라인을 추가 C# 컴파일러는 개체를 가비지 수집에 사용할 수 있도록 가장 빠른 시점을 파악하기 위해 얼마 동안은 현명했습니다. 따라서 null에 대한 할당은 도움이되지 않습니다.

0

내가 이해하지 못하는 이유는 사람들이 alloc/init을 사용하여 객체를 생성하는 대신에 자동 복구 풀을 사용해야한다고 생각하는 이유와이를 처리하는 명시적인 릴리스입니다.

가 오토 릴리즈 풀 (날짜, 나는 당신을 찾고있어) 필요로하는 부작용이 몇 개체가 있지만 대부분의 경우, 루프의

{ 
    NSString *s = [[NSString alloc] initWithFormat:...]; 
    .... 
    [s release]; 
} 

가 될 것입니다 일 autorelease에 의존하는 것보다 더 효율적입니다.

시나리오 2와 관련하여 미안하지만 NSString은 변경할 수 없습니다. 값은 변경하지 않습니다.

관련 문제