문제

내 이해는 이들 둘 다 NSMutableString을 생성하고 첫 번째 것만 시스템이 소유하고 두 번째는 내가 소유한다는 것입니다(예:풀어줘야지)둘 중 하나를 사용해야 하는 특별한 이유가 있나요? 표면적으로는 첫 번째를 사용하는 것이 더 쉬워 보이나요?또한 컴파일러에 크기 감각을 제공하므로 첫 번째가 더 좋습니까?

NSMutableString *newPath = [NSMutableString stringWithCapacity:42];

또는

NSMutableString *newPath = [[NSMutableString alloc] init];

편집하다 ...또한

두 줄로 작성된 선언을 많이 봅니다.

NSMutableString *newPath;
newPath = [NSMutableString stringWithCapacity:42];

개인적으로 저는 한 줄짜리 스타일을 선호합니다. 이것은 개인 스타일의 또 다른 예에 불과합니까?

도움이 되었습니까?

해결책

NSMutableString *newPath = [NSMutableString stringWithCapacity:42];

또는

NSMutableString *newPath = [[NSMutableString alloc] init];

둘 중 하나를 사용해야 하는 특별한 이유가 있나요? 표면적으로는 첫 번째를 사용하는 것이 더 쉬워 보이나요?

예.특별한 이유가 없는 한 항상 즉시 자동 해제하십시오.

첫 번째 이유는 글을 쓰는 것을 잊어버리기 쉽기 때문입니다. release 메시지.객체를 생성한 동일한 명령문에서 객체를 자동 해제하는 경우(예: [[[… alloc] init] autorelease]), 잊어버리는 것이 훨씬 더 어렵고 잊어버리면 훨씬 더 분명해집니다.편의 팩토리 메소드(예: stringWithCapacity:) 객체를 자동 해제하므로 직접 자동 해제할 때와 마찬가지로 나중에 해제하는 것에 대해 걱정할 필요가 없습니다.

둘째, 별도로 작성하는 것을 기억하더라도 release 메시지를 받지 못하는 것은 쉽습니다.조기 반품은 두 가지 방법이 있습니다.

NSString *str = [[NSString alloc] initWithString:@"foo"];

BOOL success = [str writeToFile:path atomically:NO];
if (!success)
    return;

[str release];

발생하거나 전파된 예외:

NSString *str = [[NSString alloc] initWithString:@"foo"];

//Throws NSRangeException if str is not in the array or is only in the array as the last object
NSString *otherStr = [myArray objectAtIndex:[myArray indexOfObject:str] + 1];

[str release];

"하지 말아야 하는 구체적인 이유"는 일반적으로 많은 개체를 생성하는 긴밀한 루프가 있다는 것입니다. 이 경우 개체 수를 유지하기 위해 루프에서 가능한 한 많은 개체를 수동으로 관리해야 할 수 있습니다. 아래에.하지만, 이것이 당신의 문제라는 증거가 있는 경우에만 이 작업을 수행하십시오. (Shark의 하드 숫자, Instruments의 하드 숫자 또는 루프가 충분히 오래 실행될 때마다 시스템이 페이징 지옥에 빠지게 됩니다).

다른, 아마도 더 나은 솔루션에는 루프를 두 개의 중첩 루프(내부 루프에 대한 자동 릴리스 풀을 생성하고 배출하는 외부 루프)로 분할하고 NSOperation으로 전환하는 것이 포함됩니다.(그러나 대기열이 한 번에 실행하는 작업 수에 대한 제한을 설정해야 합니다. 그렇지 않으면 페이징 지옥에 빠지는 것을 훨씬 더 쉽게 만들 수 있습니다..)

또한 컴파일러에 크기 감각을 제공하므로 첫 번째가 더 좋습니까?

더 나은데, 그런 이유 때문은 아닙니다.

컴파일러에게는 또 다른 클래스 메시지일 뿐입니다.컴파일러는 자신이 무엇을 하는지 모르거나 신경쓰지 않습니다.그것이 알고 관심을 갖는 모든 것에 대해 stringWithCapacity: 사용자에게 노래를 재생하라는 메시지입니다.

그것은 준다 NSMutableString 크기 힌트 - 클래스는 처음에 할당하려는 문자 저장 공간의 양을 알 수 있습니다.이것으로부터 얻을 수 있는 이점은 아마도 작을 것입니다(적어도 Mac에서는). 하지만 유용한 정보가 있다면 사용하지 않으시겠습니까?반대로, 나는 그것을 계산하기 위해 노력하지 않을 것입니다.

두 줄로 작성된 선언을 많이 봅니다.

NSMutableString *newPath;
newPath = [NSMutableString stringWithCapacity:42];

개인적으로 저는 한 줄짜리 스타일을 선호합니다. 이것은 개인 스타일의 또 다른 예에 불과합니까?

예.그러나 변수를 초기화되지 않은 상태로 두면 어느 정도 위험이 따릅니다.습관적으로 사용하기로 결정했다면 "정적 분석기 실행" 빌드 설정을 반드시 켜십시오.

다른 팁

전자는 컴파일러를위한 것이 아니라 데이터 저장을 최적화 할 수있는 방법에 대한 문자열에 대한 제안입니다. 이것은 nsdictionary/nsarray/nsset에 가장 유용합니다. 데이터 세트의 크기에 따라 구현을 내부적으로 변경할 수 있습니다..

그 외에는 정확합니다. 유일한 차이점은 소유권 문제입니다. 나는 거의 사용하지 않습니다 WithCapacity 방법, 오히려 사용하십시오 [NSMutableString string] 또는 [NSMutableArray array], 그러나 IMO, 그것은 실제로 스타일의 문제 일 뿐이며 다른 하나 이상을 사용하여 아무것도 얻거나 잃지 않을 것입니다.

첫 번째는 자동 저리 문자열입니다. 이것은 시스템에서 적절한 지점에서 공개됩니다. AutoreLease 풀에 추가되며 메모리는 시스템에 의해 처리됩니다. 일단 범위를 벗어난 후에는 유효하다고 생각할 수 없습니다. 이 유형은 메소드 내에 범위 만 있고 메소드에서 값을 반환하는 데 유용합니다.

두 번째는 유지되므로 참조 수는 1이며 자동 제출 풀에 추가되지 않습니다. 당신은 그것을 공개하고 메모리를 확보 할 책임이 있습니다. 객체의 범위를 제어하려면이 메소드를 사용하십시오. 멤버 변수 등에 사용

나는 2 줄의 초기화가 단지 스타일이라고 생각하지만, 다음 줄에 있더라도 변수를 값을 주장하지 않고 변수를 정의 할 때 2 줄 변형을 사용하지 않을 것입니다. 나는 이런 종류의 미러 멤버 변수 선언/초기화를 생각하지만, 나는 개인적으로 그것을 많이 좋아하지 않습니다.

당신은 유효한 질문을 제기합니다. 그것은 당신이하고있는 일에 달려 있지만 일반적인 iPhone 앱의 경우 첫 번째를 사용한다고 말할 것입니다. 참조 수가 0이되면 걱정할 필요가 없으면 자동으로 정리됩니다.

문자열의 메모리를 직접 관리해야 할 충분한 이유가있을 때 두 번째를 사용하십시오. 예를 들어 문자열을 청소 해야하는시기를 확인하거나 특정 시간에 메모리가 최소화 될 것으로 예상됩니다.

나는 일반적인 규칙으로서 당신이 그렇게할만한 충분한 이유가있을 때 두 번째 규칙을 사용한다고 말할 것입니다.

당신은 당신의 모든 지점에서 맞습니다!

크기/용량 힌트의 차이가 얼마나 큰지 잘 모르겠지만, 더 많은 정보는 확실히 런타임이 더 나은 결정을 내릴 수 있어야합니다.

한 스타일을 다른 스타일보다 사용하는 이유는 무엇입니까? 자, 자동 엘라스 객체는 언제 출시됩니까? 중요한 이유는 두 가지가 중요하지 않습니다. 첫째, 메소드가 많은 메모리를 사용하는 경우 즉시 릴리스 할 수 있습니다. (로컬 자동 제출 풀을 사용할 수도 있습니다.) 마일리지는 코드의 연령과 품질에 따라 다를 수 있습니다.

처음으로 iPhone 앱을 개발하기 시작했을 때 항상 AutorELeded 객체를 사용했습니다. 모든 것이 어떻게 작동했는지 완전히 이해하지 못했고 보통 옳은 일을했기 때문에 편리했습니다. 요즘 나는 수동으로 거래하는 메모리 측면에서 잘못된 경향이 있습니다. 참조 계산이 실제로 어떻게 작동하고 그렇지 않을 때 즉시 문제를 강요하는지 실제로 이해할 때는 그렇게 어렵지 않습니다.

줄이 얼마나 오래 필요한지 확신한다면, 계속해서 -initwithCapacity : method를 사용하십시오. 문자열의 스토리지를 초과하면 저렴한 작업이 아닌 재 할당 및 복사가 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top