문제

나는 단지 시작에 모습을 가 Objective-C,코코아 보기와 재생 iPhone SDK.나는 합리적으로 편안 C mallocfree 개념,그러나 코코아를 참조 계산 방식이 나에게 오히려 혼란이다.내가 말한 그것은 매우 우아하면 당신은 그것을 이해 하지만 나는 그냥하지 않은 고비가 아직.

어떻게 release, retainautorelease 작업과 어떤 규칙을 사용에 대해 자?

(또는 실패하는,당신은 무엇을 읽는 도움 당신은 그것을 얻는가?)

도움이 되었습니까?

해결책

시작하자 retainrelease; autorelease 정말 특별한 경우에 한해 기본적인 개념입니다.

에서 코코아,각각의 물체 추적에 얼마나 많은 시간을 참조(특히, NSObject 기본 클래스를 구현하는 이).를 호출하여 retain 에체,당신은 그것을 말하고 원하는까지 참여 하나입니다.를 호출하여 release, 에,당신은 말하는 개체의 이동시키고,참가 감소합니다.는 경우,를 호출한 후에 release, 참조 횟수는 지금 제로,그 개체의 메모리를 해제하여 시스템입니다.

기본적인 방법이 다릅니다 mallocfree 는 특정 개체지에 대해 걱정할 필요가 시스템의 다른 부분에 충돌이 있기 때문에 당신은 메모리를 해제들이 사용한다.가정하면 모두가 함께 연주하고 유지/방출 규칙에 따라,하나의 조각의 코드를 유지하고 안전하게 풀어줍 개체의 다른 부분의 코드도 개체를 참조하는 것이 영향을 받지 않습니다.

무엇을 수 있는 상황에서는 전화해야 합니다 retainrelease.나의 일반적인 엄지손가락의 규칙이 내가 원하는 경우에는 개체를 위해 일정 시간(의 경우 멤버변수는 클래스에서,예를 들어),그때는 것을 확인할 필요가 객체 참조 횟수를 알고 있습니다.위에서 설명한 대로,개체의 참조 횟수가 증가를 호출하여 retain.컨벤션,그것은 또한 증가(1 로 설정되어,정말)때 만들어진"초기화"방법입니다.중 하나에서의 이러한 경우,그것은 나의 책임 전화 release 에 객체를 할 때 내가 그것으로 끝났어요.하지 않는 경우에있을 것입니다,메모리 누수가 일어나지 않습니다.

어 만들기:

NSString* s = [[NSString alloc] init];  // Ref count is 1
[s retain];                             // Ref count is 2 - silly
                                        //   to do this after init
[s release];                            // Ref count is back to 1
[s release];                            // Ref count is 0, object is freed

지금 autorelease.오토 릴리즈로 사용 편리한(그리고 때로는 필요)방법을 말하는 시스템을 무료로 이체 후 약간의 동안.에서 배관의 관점에서,때 autorelease 라고,현재 스레드의 NSAutoreleasePool 는 경고의 호출합니다.이 NSAutoreleasePool 이제 알고있는 그것은 기회를 얻(후 현재 반복 이벤트의 루프)를 호출할 수 있습 release 에 개체입니다.로 우리의 관점에서 프로그래머의 돌출 release 우리를 위해,그래서 우리는 없다(그리고 사실,우리는 없).

무엇이 중요한 참고(다시 컨벤션)모든 개체 생성 클래스 방법을 반환 autoreleased 개체입니다.예를 들어,다음 예에서 변수"s"참조 계산의 1 지만,후에 이벤트 루프가 완료되면,그것은 파괴 될 것입니다.

NSString* s = [NSString stringWithString:@"Hello World"];

하려는 경우에는 문자열을,당신을 호출해야 retain 명시적으로 다음을 명시적으로 release 그것은 당신이 완료되면.

다음을 고려하십시오(매우 고안)코드 비트,그리고 당신이 볼 수는 상황이 autorelease 이 필요합니다:

- (NSString*)createHelloWorldString
{
    NSString* s = [[NSString alloc] initWithString:@"Hello World"];

    // Now what?  We want to return s, but we've upped its reference count.
    // The caller shouldn't be responsible for releasing it, since we're the
    // ones that created it.  If we call release, however, the reference 
    // count will hit zero and bad memory will be returned to the caller.  
    // The answer is to call autorelease before returning the string.  By 
    // explicitly calling autorelease, we pass the responsibility for
    // releasing the string on to the thread's NSAutoreleasePool, which will
    // happen at some later time.  The consequence is that the returned string 
    // will still be valid for the caller of this function.
    return [s autorelease];
}

난 이 모든 걸 이해 조금 어느 시점에서,그럼에도 불구 하 고,클릭합니다.여기에 몇 가지를 참조하 당신을 얻을:

  • 애플의 소개 하는 메모리를 관리합니다.
  • 코코아에 대한 프로그래밍 Mac OS X(4th Edition), 에 의하여,아론 Hillegas-매우 잘 쓰여진 책이 많은 좋은 예입니다.그것처럼 읽습니다.
  • 당신이 진정으로 다이빙에서,당신은 머리 큰 괴상한 Ranch.이것은 훈련시설을 실행하여 아론 Hillegas-이 책의 저자는 위에서 언급된다.에 참석했 소개 코코아 코스가 몇 년 전,그것은 좋은 방법을 배웁니다.

다른 팁

을 이해하는 경우 프로세스를 유지/방출한 다음 두 가지가 있 황금 규칙"이런"분명하여 설립된 코코아 프로그래머지만,불행히도는 거의 철자가 이 명확하게 이민자를위한.

  1. 는 경우에 반환하는 함수 개체 alloc, createcopy 그 이름에 그 개체는 당신입니다.를 호출해야 합니다 [object release] 당신이 완료되면니다.나 CFRelease(object), 는 경우,그것은 핵심 기초 개체입니다.

  2. 하지 않는 경우에는 이러한 단어 중 하나에서 그 이름에 그 개체 그리고 다른 사람.를 호출해야 합니다 [object retain] 유지 하고자 하는 경우에는 개체의 종료 후의 기능입니다.

당신은 것을 제공하도 따라 이 협약에서 함수를 자신을 만들 수 있습니다.

(Nitpickers 은:예,저도 몇 가지는 API 은 이러한 규칙에 예외 그러나 그들은 희귀).

만약 당신이 쓰는 코드에 대한 데스크톱 및 타겟팅할 수 있습니다 Mac OS X10.5,당신은 적어도 보는 사용으로 목표-C 쓰레기 컬렉션입니다.그것은 정말 단순화합니다 대부분의 개발 그 이유는 애플 모든 노력으로 그것을 만드는 첫 번째 장소에서,그리고 그것을 잘 수행합니다.

으로 메모리에 대한 관리 규칙을 사용하지 않는 경우 GC:

  • 을 만들면 새로운 객체를 사용하여 +alloc/+allocWithZone:, +new, -copy-mutableCopy 는 경우 또는 당신 -retain 체,당신은 그것의 소유권 및 확인해야 합송 -release.
  • 을 받을 경우 객체에 어떤 다른 방법으로,당신은 당신 그것의 소유자 및야 장송 -release.
  • 당신이 원하는지 확인하기 위한 개체를 발송 -release 는 경우도 있었습니다.는 자신을,또는 당신이 보낼 수 있는 개체 -autorelease 현재 오토 릴리즈 수영장 보내드립니다 -release (당 한번 받았 -autorelease)을 때 수영장이 배출한다.

일반적으로 -autorelease 한 방법으로 사용된다는 것을 보장하는 개체를 위해 살고의 길이는 현재 이벤트이지만,정리,나중에 같이 오토 릴리즈 수영장을 둘러싸는 코코아의 이벤트 처리합니다.에서 코코아,그것은 far 더 많은 일반적인 개체를 반환하자는 autoreleased 보다 그것은 반환하는 오브제는 발신자가 자체에 필요한 위치에 놓습니다.

목표-C 를 사용 참조 계산, 즉,각각의 개체에 대한 참조가 있는 계산합니다.개체를 만들 때,그것은 참조를 수"1"입니다.간단히 말하자면,오브젝트가 불(즉,어딘가에 저장),그것은"유"의미하는 참 하나씩 증가합니다.할 때는 객체가 더 이상 필요하지 않습니다,그것은"출시"의미하는 참 하나씩 감소합니다.

할 때는 객체 참조를 수가 0 개체가 해제됩니다.이것은 기본적인 참조를 계산합니다.

어떤 언어를 참고 자동으로 증가와 감소했지만,objective-c 하지 않은 한 사람들의 언어.따라서 프로그래머에 대한 책임을 유지하고 해방시킨다.

전형적인 방법을 쓰는 방법입니다:

id myVar = [someObject someMessage];
.... do something ....;
[myVar release];
return someValue;

문제를 필요로의 기억을 취득한 내부 리소스의 코드는 모두 지루하고 오류가 발생하기 쉽습니다.Objective-C 소개 다른 컨셉을 목표로 만들이 훨씬 더 쉽게:오토 릴리즈 수영장이 있습니다.오토 릴리즈 수영장은 특별한 개체에 설치되어 있는 각 스레드가 있습니다.그들은 매우 간단한 클래스는,당신이 NSAutoreleasePool.

할 때는 객체를 가져옵니다"오토 릴리즈"메시지가 전송되고,개체의 모습에 대한 모든 오토 릴리즈 수영장에 앉아 스택한 이 현재 thread.그것은 추가 객체로 목록에 객체를 보내는"출시"메시지는 어떤 시점에서 미래,일반적으로 때 수영장 자체 발표했다.

복 위의 코드는,다시 작성할 수 있습니다 그것은 짧고 읽기 쉽게 말

id myVar = [[someObject someMessage] autorelease];
... do something ...;
return someValue;

기 때문에 객체를 autoreleased,우리는 더 이상 필요 없을 명시적으로 부르는"출시"니다.이것은 우리가 알고 있기 때문에 일부 오토 릴리즈 수영장을 위해 그것을 할 것입니다.

희망이 도움이 됩니다.의 위키 문서에 대한 참조를 계산합니다.더 많은 정보에 대한 오토 릴리즈 수영장 여기에서 찾을 수 있습니다.또한 이 경우 당신은 당신을 위해 건물 Mac OS X10.5 고 나중에,당신이 말할 수 있는 엑스 코드를 구축하는 가비지 컬렉션을 사용할 수 있도록 완전히 무시하지/release/오토 릴리즈.

여호수아(#6591)-쓰레기 수집에서 맥 OS X10.5 보이지만 사용할 수 없습니다 아이폰(또는 당신이 원하는 경우 응용 프로그램을 실행 하 pre-10.5 버전 Mac OS X)

또한,당신은 라이브러리를 작성하거나 무언가 다시 사용될 수 있습을 사용하여 GC 모드 잠금 누구를 사용하는 코드로도 사용하여 GC 모드므로 나는 그것을 이해하고,누구나 하려고 쓰기 널리 재사용할 수 있는 코드를 이동하는 경향이있 관리를 위한 메모리합니다.

으로,지금까지 사람들이 시작하려고 다시어 참고 자료들은 거의 변함없이 뭔가 잘못된 또는 제공 불완전한 설명이 있습니다.

애플의 제공에 대한 완전한 설명 코코아의 메모리 관리 시스템 메모리 관리 프로그래밍 가이드에 대한 코코아, 의 끝에있는 짧지만 정확한 요약 메모리 관리 규칙.

나에 추가하지 않는 특정의 유지/방출보다 다른 생각을 할 수 있습에 대해 떨어지는$50 고 Hillegass 책지만,나는 것이 좋을 얻으로 악기를 사용하여 매우 도구 개발 초기에의 응용 프로그램(심지어 당신의 첫 번째 중 하나!).이렇게 실행->으로 시작 성능 도구입니다.는 누수는 단 하나의 많은 기기를 사용할 수 있지만하는 데 도움이 될 것입할 때 표시합니다 잊었습니다.그것이 종료하기 어려운 얼마나 많은 정보를 확인할 수 있다.그러나이 튜토리얼을 확인하고 빠르게 갈:
코코아 튜토리얼:고정 메모리 누수와 악기

실제로 노력하고 누출을 더 나은 방법이 될 수 있습니의 차례로 배우를 막는 방법에 대해 설명합니다!행운을 빕니다;)

매트한 텍사스 쓴:

return[[s 오토 릴리즈]릴리스];

오토 릴리즈가 을 유지한다.오토 릴리즈 단순히 그것을 두고 줄을 서서 발표된다.당신이 원하지 않을 수 있 릴리스 문이 있다.

나의 일반적인 컬렉션 코코아의 메모리 관리 기사:

코코아의 메모리 management

무료 스크린에서 사용할 수 있 iDeveloperTV 네트워크

메모리 관리 Objective-C

NilObject 의 대답은 좋은 출발점이 될 수 있습니다.여기에 몇 가지 추가 정보에 관한 설명서 메모리 관리(필수 아이폰에).

만약 당신이 개인적으로 alloc/init 체,그 참조 계산의 1.당신이 한적한다면 그것은 더 이상 필요하지 않거나,통화 [foo release][foo autorelease].릴리즈를 정리하는 반면,오토 릴리즈가 개체 오토 릴리즈 수영장,어떤 것이 자동으로 해제됩니다.

오토 릴리즈는 주로 때 당신이하는 방법을 필요로 하는 객체를 반환하에서 질문(그래서할 수 없는 수동으로 해제,다할 것을 반환 nil 체 다)하지만 당신이 원하지 않는 그것을 잡아,중 하나입니다.

는 경우에 당신을 획득하는 개체를 호출하지 않았다 alloc/init 그것을 얻을--예를 들어:

foo = [NSString stringWithString:@"hello"];

하지만 당신이 원하는 걸 이 객체를 호출해야 합[foo 유지].그렇지 않으면,그것은 가능한 그것을 얻을 것이다 autoreleased 고 당신은에 들고 무기 호 참조 (는 것처럼 위의 stringWithString).더 이상 필요 없는 경우,그것을 전화 [foo release].

이 위에 답변을 명확하게 제 restatements 의 문서를 말한다;의 문제를 새로운 사람으로 실행하가 문서화되지 않은 경우입니다.예를 들어:

  • 오토 릴리즈:docs 것이라고 트리거 출시"에서 어떤 시점에서 미래입니다." 면?!기본적으로,당신이 믿을 수있는 개체의 주위에 종료할 때까지 당신의 코드로 다시 시스템 이벤트 루프입니다.시스템 수출 개체 어떤 시간 후 현재 이벤트 cycle.(나는 생각한 매는 것을 말했습니다.)

  • 적 문자열: NSString *foo = @"bar"; -당신을 유지해야 또는 출시까?No.는 방법에 대

    -(void)getBar {
        return @"bar";
    }
    

    ...

    NSString *foo = [self getBar]; // still no need to retain or release
    
  • 성 규칙:을 만든 경우에 그것은,당신은 그것을 소유하고 예상했습니다.

일반적 방법,새로운 코코아를 프로그래머 엉망입에 의해 이해하지 않는 루틴을 반환성 retainCount > 0.

여기에서 코드 조각 매우 간단에 대한 규칙을 메모리에서 관리,코코아:

보존 규칙 계산

  • 에서는 주어진 블록의 사용,복사,-alloc 및 유지 같아야 하는 사용 릴리스와-오토 릴리즈.
  • 체를 사용하여 만든 편의 생성자를(예를들면@입의 stringWithString)로 간주됩 autoreleased.
  • 구현-dealloc 방법을 출시 instancevariables 당신의 자신

제 1 회 총알을 말한다:는 경우에 당신 alloc (나 new fooCopy다),당신을 호출해야에 출시하는 개체입니다.

2 탄 말한다:를 사용하는 경우 편의 생성자 그리고 당신은 필요합체 놀아 (으로 이미지로 그려야 하는 이상),당신은 당신을 유지할 필요가(그리고 나중에 자료)니다.

3 해야 별다른 설명이 필요하지 않습니다.

의 많은 좋은 정보에 cocoadev 도:

으로 여러 사람들이 이미 언급 애플의 소개 메모리 Management 로 시작하는 가장 좋은 장소입니다.

하나는 유용한 링크를 보지 않은 아직 언급은 실용적인 메모리 Management.당신이 그것을 찾을 수 있에서의 애플의 문서를 읽으면 그들을 통지만,그것의 가치가 직접 연결을 제공합니다.그것의 화려한 요약의 메모리 관리 규칙과 예의 일반적인 실수(기본적으로 어떤 다른 대답이 여기 있는 설명하려고하지만,지 않습니다.)

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