2011-02-02 2 views
1

예를 들어, 다음 예제를보십시오.나중에 리턴 될 인스턴스 메소드에서 오브젝트를 할당하는 권장 방법은 무엇입니까?

-(NSString*)getString{ 
    return [[NSString alloc] initWithFormat:@"test"]; 
} 

-(void)printTestString{ 
    NSString *testStr = self.getString; 
    NSLog(@"%@",testStr); 
[testStr release]; 
} 

코드 1과 코드 2는 유효한 코드 조각이어야하며 누수가 없어야합니다.

코드 1은 autorelease를 사용하므로 반환 변수는 printTestString에 유지되어야하고 사용 후에는 해제되어야합니다. 따라서 여기에 작은 오버 헤드가 있습니다.

코드 2는 getString에서 NSString을 해제하지 않으므로 사용 후에 만 ​​릴리스해야합니다. 적은 양으로 작성해야하고 autorelease가 사용되지 않기 때문에 오버 헤드가 없습니다.

실제로 사용되는 사실상의 "표준"접근법은 무엇입니까?

나 자신에게 묻고 있었던 또 다른 물건. autorelease 풀이 변수를

NSString *testStr = self.getString; 

다음에 바로 해제하면 getString의 autorelease와

이 문제가 될 수 있습니까? 그럴 수 있습니까 아니면 컴파일러는 그런 종류의 일을 방지합니까?

고마워요

- 보보

+1

@MusiGenesis Obj-C가 마음에 들지 않으면 프로그램을 작성하지 말고 사람들의 Obj-C 질문에 대답하지 마십시오. – jakev

+0

@ JakeVA 감사합니다! – Sebo

답변

2

이를 수행

-(NSString*)getString{ 
    return [[[NSString alloc] initWithFormat:@"test"] autorelease]; 
} 

-(void)printTestString{ 
    NSString *testStr = self.getString; 
    NSLog(@"%@",testStr); 
} 

귀하의 getString 메소드가 printTestString은 유지하거나 해제 할 필요가 없습니다 의미있는 NSString을 autoreleases. getString의 autoreleasing은 객체를 할당했기 때문에 의미가 있습니다. 따라서 객체의 '소유자'입니다. 계속 진행하기 전에 Objective-C의 메모리 관리 규칙을 연구하는 것이 중요하므로 매우 중요합니다.

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH

+0

좋아,하지만 난 아직도 autorelease를 사용해야합니다. 나는 그것을 사용하지 않음으로써 해결할 수 있기를 희망했다. 내가해야 할 것처럼 보입니다. 내 코드가 가능한 한 효율적일 때 나는 그것을 정말로 좋아한다. – Sebo

+0

당신은 할 필요는 없지만 객체를 생성하고 반환하는 메소드가있을 때, 당신은해야합니다. 모든 사람들은 코드가 가능한 한 효율적일 때 그것을 좋아합니다. autorelease를 호출하면 생성하지 않은 기존의 풀에 추가됩니다 (않는 한). 그 풀이 흘러 나올 때, 당신의 객체는 해제 메시지를받습니다. 그게 유일한 오버 헤드 일 뿐이지 만, 그다지 큰 거래는 아닙니다. – jakev

+0

Ok JakeVA, 감사합니다. 나는 autorelease로 납득되고 지키다. – Sebo

2

제이크의 대답은 거의 모든 당신이 방법에서 개체를 반환하는 데 필요한 상황에 맞게 설정되어 있지만, 오토 릴리즈되지 않은 무언가를 반환 할 수있는 경우가 있습니다. Memory Management Programming Guide에서 (Mac 버전,하지만 그들은 같은 규칙이야) : 당신은 이름이 는 "ALLOC"또는 "새로운"또는 로 시작하는 방법을 사용하여 만들 경우

당신은 개체의 소유권을 "copy"(예 : alloc, newObject 또는 mutableCopy)가 포함되어 있거나 에 보관 메시지가있는 경우 객체 반환 값, 당신은 그들이 객체 생성 또는 객체 복사하지 않는 한이 값은 을 오토 릴리즈 반환 있는지 확인 당신의 방법과 기능에

다음 Coding Guidelines for Cocoa에서 또한

, 메소드 (new, alloc, copy 및 그 변형). 이 컨텍스트에서 의 "Autoreleased"는 반드시 개체가 명시 적으로 이 자동 수락되어야 함을 의미하지 않습니다. 즉, 자동 응답을 반환하기 직전에 개체에 보내야합니다. 일반적인 의미에서, 은 단순히 호출자가 반환하는 값이 이 아니라는 것을 의미합니다. 성능상의 이유로

, 그것은 바람직 이 메소드 구현에 객체를 autoreleasing 피할 수의 때마다, 특히 짧은 기간 내에 자주 을 실행할 수있는 코드 과 함께 할 수있는; 의 예는 알 수없는 코드 인 과 잠재적으로 높은 루프 수입니다.

따라서, 접두사를 포함하는 방법은 alloc 또는 new, 또는 규칙에 따라 단어 copy을 포함한 것과 당신이 오토 릴리즈되지 않은 객체를 반환해야합니다. 사실, Clang 정적 분석기는이 규칙을 이해하고 이러한 이름 지정 규칙을 따르는 메소드에서 반환되는 autoreleased가 아닌 객체를 가정합니다.

나는 자동 회수 된 객체 (autorelease 풀 등을 관리하고 싶지 않은 엄격한 루프)를 반환하지 않기를 원하는 상황에서 new 접두어를 사용했습니다. 다시 말하지만 autoreleased 객체를 반환하는 것은 거의 모든 경우에 권장되는 방법이지만,이를 방지하려는 경우가 있습니다.

관련 문제