2

인스턴스 메소드가 편리한 생성자로 초기화 된 값을 반환하면 해당 객체를 유지 한 다음 반환시 자동 반환을 수행하여 편의 생성자의 autorelease가 발생하면 해당 객체가 자동으로 생성되지 않도록합니다. 개체를 제거하지 마십시오."편의 생성자"를 통해 초기화 된 객체 반환

이 릴리스 설명을 호출 코드 앞에두고 소유권을 가지고 소유권을 가져 오나요?

- (NSStringMutable *)test { 
    NSMutableString *description = [NSMutableString stringWithString:@"Test Value"]; 
    return description; 
} 

또는 이렇게해야합니까?

- (NSStringMutable *)test { 
    NSMutableString *description = [NSMutableString stringWithString:@"Test Value"]; 
    [description retain];        
    return [description autorelease]; 
} 

호출 코드 :

NSMutableString *testVar = [[NSMutableString alloc] initWithString:[object description]]; 

답변

9

아니, 당신은 괜찮을 것이다.

자동 복구 풀이 특정 시간에 소모됩니다. 가비지 수집기와 다릅니다. 버튼 클릭 핸들러와 같은 이벤트 핸들러를 구현하는 경우 이벤트 핸들링 코드에서 돌아 오면 자동 릴리즈 풀이 프레임 워크에 의해 소모됩니다.

당신이 사용했던 경우

- (NSStringMutable *)test 
{ 
    NSMutableString *description = [NSMutableString stringWithString:@"Test Value"]; 
    [description retain];                
    return [description autorelease]; 
} 

... 다음 개체가 둘의 수를 유지할 것 두 번 오토 릴리즈 풀에있을 것입니다, 실제로에서와 동일한 방식으로 동작 것이다 이전 코드 예제.

+0

+1이 질문에 대한 답변은 – Abizern

+2

맞지만, 카운트 유지에 대해 이야기하는 것을 피하려고합니다. 그들은 빨간색 청어입니다. NSMutableString이 자동 회수 된 객체를 반환 할 것이라는 보장이 없으며, 현재 소유하고 있지 않습니다. 메모리 관리 규칙에 명시 적으로 "해당 메소드가 객체를 호출자에게 안전하게 반환 할 수 있기 때문에"결과를 호출자에게 안전하게 반환 할 수 있습니다.

+2

좋은 지적입니다. 나는 물건을 설명하는 데 유용 할 보유 수에 관해서 생각한다. 맞습니다. stringWithString은 다른 누군가가 소유 한 객체를 반환한다는 것을 알고 있습니다. 이 경우 NSMutableString이 실제로 객체를 할당했기 때문에 NSMutableString이 그것을 해제해야 할 책임이 있습니다. 그러나 이러한 편의 생성자 (비 초기화 생성자)는 일반적으로 자동으로 릴리즈 된 객체를 반환한다는 인상을 받았습니다. 이런 식으로 행동하지 않은 사람을 만나게되면 놀라실 것입니다. –

0

아니, 당신은 단순히 오토 릴리즈 값을 반환 할 수 있습니다. 그 이유는 autorelease가 변수 자체의 기능이 아니라는 것입니다. autorelease 풀의 기능입니다. 사용자가 직접 작성하지 않는 한 일반적으로 실행 루프가 관리합니다. 이것은 하나의 유지 수를 가진 객체를 떠나 오토 릴리즈 풀에있을 것입니다

- (NSStringMutable *)test 
{ 
    return [NSMutableString stringWithString:@"Test Value"]; 
} 

:

0

두 번째 전화 번호와 가까울지라도 여기에서 이야기하고있는 경우에는 보관할 필요가 없으며 실제로 자동 회수를 직접 요청하지 않아도됩니다.

stringWithString 이미 오토 릴리즈 개체를 반환하기 때문에 이것은, 유효 : 일반적으로

- (NSStringMutable *)test 
{ 
    return [NSMutableString stringWithString:@"Test Value"];   
} 

을 당신이 간이 생성자를 호출하는 경우 오브젝티브 C를 사용하여 객체 생성 할 때 (ALLOC를 호출하지 및 초기화) 반환 값 stringWithString은 자동 반환 된 객체를 반환하므로 방금 반환 할 수 있습니다.

1

그냥 반환 할 수 있습니다. 이것은 autorelease의 주요 목적 중 하나입니다. 스스로 자동 풀 풀을 설정하지 않았다면, 다음 번에 이벤트 루프를 실행할 때까지 풀이 비워지지 않을 것입니다. memory management programming guide은이 모든 것을 아주 자세하게 설명합니다. 편안함을 느낄 때까지 읽어야합니다.

사이드 노트 :이 이 안전하지 않고 autorelease 풀이 약간의 기묘한 이유로 일찍 소모 될 경우 두 개의 유지 및 두 개의 자동 응답기가 차이를 만들지 않을 것입니다. 숫자는 여전히 균형을 이루고 있기 때문에 어느 시점에서는 여전히 존재하지 않을 것입니다.

이미 정답 투표 한
1

, 나는 스타일 참고로이 추가 해요 :

[object test]

를 호출해야합니다 때 [object description]를 호출하기 때문에 귀하의 호출 코드가 작동하지 않을

정말로 문자열을 변경할 수 있어야하는 경우가 아니면 변경 가능한 문자열을 반환하지 않아도됩니다. 나는 개인적으로 내가 쓰는 코드에서 변경 가능성을 최소화하려고 노력한다. 왜냐하면 나는 상태 변경이 최소화 된 프로그램을 유지하는 것이 더 쉽다고 느낀다. 당신은 설명을 되돌려 놓을 뿐이므로 변경할 필요가 없다고 생각합니다. 이 값을 변경 할 수 있도록하려면 그리고 문자열을 반환

-(NSString *)description { 
    // Just return a static NSString. No need to worry about memory management. 
    return @"Test Value"; 
} 

:이 알고

당신은이를 다시 작성할 수 그래서 어쩌면 내가 너무 까다롭게하고있어 일부 예제 코드입니다 귀하의 호출 코드에서 :

이 문자열에 대해 alloc을 호출 했으므로, 귀하는이 문자열을 소유하고 있기 때문에 나중에 어느 날짜에 해제해야합니다. (가 NSMutableCopying 프로토콜을 준수하는 경우 물론,)

NSMutableString *testVar = [[object description] mutableCopy]; 

이도 불변의 객체의 변경 가능한 사본을 반환합니다

양자 택일로, 당신은 코드의 내가 가장 좋아하는 비트 중 하나를 사용할 수 있습니다. 그리고 어떤 단계에서 [testVar release]을 보내야합니다.

그리고 질문에 대한 실제 응답으로이에 넥타이 : 당신이 ALLOC, 사본, mutableCopy, 또는 객체에 유지를 보내는 경우, 다음 개체를 소유하고 전송에 대한 책임이 있습니다 그것 릴리스 메시지. 자동 복구 된 객체를 반환하는 것으로 간주 할 수 있습니다.

다시 말하지만,이 질문은 사용자가 질문 한 샘플 코드 중 일부입니다. 위의 규칙을 따르면 메모리 관리 문제가 대부분 분류됩니다. 첫 번째 예에서는 메시지에 대해 아무 것도 보내지 않으므로 메모리를 직접 해제 할 필요가 없습니다. 그러나 전화 코드에 alloc이 있으니 testVar을 소유하고 있어야합니다.

+0

입력 해 주셔서 감사합니다. 나는 mutableCopy에 대해 몰랐다.이 질문은 나의 질문에 대한 예일뿐입니다. 고심 해 주셔서 감사합니다. 나는 객관적인 C에 대해 상당히 새롭다. NSMutableString을위한 initWithString에 전달할 수있는 NSString을 반환한다고해도 나는 없었다. 정보 주셔서 감사합니다. – Brian

관련 문제