2010-07-25 6 views
0

Objective-C를 완전히 처음 접했고 언제 객체를 할당하고 해제해야하는지 알아 내려고했습니다.할당 할 필요가 있는지, 배포해야하는지 어떻게 알 수 있습니까?

예를 들어 웹에서 일부 데이터를 가져 오려고합니다.

NSURLRequest *theRequest=[NSURLRequest requestWithURL: 
        [NSURL URLWithString:@"http://www.apple.com/"] 
        cachePolicy:NSURLRequestUseProtocolCachePolicy 
       timeoutInterval:60.0]; 
// create the connection with the request 
// and start loading the data 
NSURLConnection *theConnection=[[NSURLConnection alloc] 
           initWithRequest:theRequest delegate:self]; 

내가 이해하지 못하는 것은 : 왜 그들은 연결이 아니라 요청에 ALLOC를 호출해야 할이 코드를 가지고있는 애플에 an article 발견? 할당이 필요한 시점과 그렇지 않은 시점을 어떻게 알 수 있습니까?

릴리스와 유사한 질문입니다. 내가 읽은 것부터, alloc/init을 사용하여 초기화 된 객체 만 릴리스해야합니다. 그러나 모든 "initWithXXX"함수는 대신 자동 렌더링 된 객체를 반환합니다.

이것은 어려운 규칙입니까, 아니면 규칙적인 것입니까? 객체를 릴리스해야하는지 여부를 찾는 방법이 있습니까?

+0

비슷한 질문이 이미 있습니다. 예 : http://stackoverflow.com/questions/2379800/what-objects-do-i-alloc-release –

답변

1

Memory Management Programming Guide을 읽어보십시오. 이것들은 모두 거기에 설명되어 있습니다. Learn Objective-C도 확인하십시오.


왜 그들은 연결이 아니라 요청에 ALLOC를 호출해야합니까?

개체를 소유해야만 함수의 범위보다 오래 살 수있을 때마다 개체는 -retain이어야합니다. 물론 사용할 수 있습니다

NSURLConnection* theConnection = [NSURLConnection connectionWithRequest:theRequest 
                   delegate:self]; 

그러나 연결은 -autorelease d가됩니다. 그러나 연결이 완료 될 때가 있기 때문에이 변수는 연결이 무효화되지 않도록 -retain이어야합니다. 물론, 다음, 당신은

NSURLConnection* theConnection = [[NSURLConnection connectionWithRequest:theRequest 
                   delegate:self] retain]; 

을 할 수 그러나이 +alloc-init-autorelease-retain에 해당, 마지막 두 단계는 중복입니다. Apple이 여기에 +alloc/-init을 사용하는 이유가 여기에 있습니다.

가 (BTW,이 스타일은 정적 분석기는 불평을 일으킬 것입니다. 그것은 위임 객체, 어딘가 바르로 예를 theConnection를 저장하는 것이 좋습니다.) 한편

의 NSURLRequest은 임시 객체이다 함수가 끝나면 -release d가되어야합니다. 다시 말하지만, 당신은 오토 릴리즈 풀을 가득하지만,이 방법 하나 -release 잊지과 누수가 발생할 수를 사용하지 않으므로이 훨씬 더 효율적입니다

NSURLRequest* theRequest = [[NSURLRequest alloc] initWithURL:...]; 
... 
[theRequest release]; 

를 사용할 수 있습니다.

그러나 모든 "initWithXXX"함수는 자동으로 렌더링 된 객체를 대신 반환합니다.

아니요, -init…-autorelease 개체를 반환하지 않아야합니다.

+0

세 가지 답변이 모두 도움이되므로 받아 들여야합니다. 완료하십시오. –

1

initWithXXX: 방법 반환 자동 수거 된 개체! 그렇지만 클래스 메서드는 somethingWithXXX:입니다. 이 이며 (컴파일러가 적용되지 않는다는 점에서) 규칙이지만 엄격하게 따라하기 때문에 엄격한 규칙으로 처리 할 수 ​​있습니다. 또한 Clang 정적 분석기는 사용자가 따르지 않으면 불평합니다.

requestWithURL:에는 이름에 "init"이 없습니다. 또한 requestWithURL:NSURLRequest 클래스에서 호출되는 반면 initWithRequest:delegate:NSURLConnection 클래스에서 alloc을 호출하여 반환 된 NSURLConenction 개체에서 호출됩니다.

는 (나는 모든 의미가 있기를 바랍니다.)

2

Cocoa Memory Management guide을 읽어보십시오. 당신은 방법을 얻기 위해 사용하는 경우에만 객체가 하나 포함되어 소유 :

  • new
  • alloc
  • retain
  • copy

... 그리고 당신은 단지 release 필요 (소유권 포기). 이들 중 하나도 포함하지 않는 메소드를 통해 인스턴스를 얻은 경우, 인스턴스를 소유하지 않고 명시 적으로 (retain 사용) 소유권을 가져야합니다. 어떤 간이 생성자 사용할 수있는 경우

  • 소유권 또는
  • 을 원하는 (그리고 따라서 alloc/init 사용해야합니다)

를 다음과 같은 경우

그래서, 당신은 alloc 필요 이니셜 라이저 메소드는 자동 변환 된 인스턴스를 리턴하지 않고 alloc 인스턴스를 초기화합니다.

관련 문제