7

메서드에 매개 변수로 NSError 개체가 필요한 많은 코코아 메서드가 있지만 오류가있을 경우 오류 메서드를 호출 메서드로 반환하는 수단입니다. 반환 된 객체가 유지됩니까? 그건있을 필요합니까, 호출 오브젝트 코드 (오류가 반환되는 방법)에서, 코드 같은 몇 가지 :이 어디서나 볼, 그리고 한반환 된 NSError 객체를 릴리스해야합니까?

NSError *error; 
    [apiCall .... error:&error]; 

    if (error){ 
    [*error release]; 
} 

은 할 필요가없는 경우 이걸 어떻게 할 수 있니?

답변

7

반품 된 오브젝트는 일반적으로 자동 작업 처리됩니다. 일반적으로 copy/alloc/retain을 동일한 개체에 이전에 호출 한 경우에만 auto-/release으로 전화하면됩니다. 당신은 오류에 대한 메모리를 할당하지 않은

// right 
[error code] 
// wrong 
[*error code] 
+0

[* 오류 코드]를 삽입 한 이유는 NSError var를 다음과 같이 지정할 수도 있기 때문입니다. NSError ** error; 어떤 물체를 가리키는 점입니다. 이게 유효합니까? – casademora

+0

"out 파라미터"또는 "output 파라미터"일 때만'error'의 타입으로'NSError **'를 지정합니다. 이 경우 당신은 역 참조 (dereference)하지만,'* error'는'NSError * '타입을 가질 것입니다. 매개 변수를 사용하면 함수에 반환 값이 하나만 있다는 사실을 알 수 있습니다. Objc-C의 Out 매개 변수는 인수가 값별로 전달되기 때문에'Type **'을 사용합니다. 또한'error'가'NSError **'타입을 가지고 있다면'NSError * '에 대한 포인터로 초기화 (API 호출에서 무엇을하는지)하거나 포인터를 할당해야합니다 그러나 조금 이상합니다. – outis

+0

@outis autoreleased되면 잘못된 호출자 메서드에서 사용하지 않는 것입니다. NSError *를 실제로 생성하고 out 매개 변수 NSError **에 할당 한 메서드의 범위가 메서드 호출로 끝났으므로 호출자에서이 메서드를 사용합니다. – SayeedHussain

4

, 그래서 당신은 그것을 해제 할 필요가 없습니다 : 그리고 당신은하지 메서드 호출에 error 역 참조 할 것. 원칙적으로, 프레임 워크는 보통 생성 한 객체에 자동 회수 기능을 추가합니다.

6

developer.apple.com의 메모리 규칙을 읽어보십시오. '이전에 copy/alloc/retain'이라고 말한 사람은 절대로 믿지 마십시오. 규칙이 아닙니다. 실제로 '당신은 복사, 새 이름 또는 이름의 일부로 할당 된 메소드. 다시 말하지만, 나를 믿지 마십시오. developer.apple.com

NSError * *에 대해서는 잘못되었습니다. METHOD는 인수로 NSError * *를 취합니다. 즉, NSError *에 대한 포인터입니다. NSError *에 대한 POINTER는 어딘가의에서 오는 NSError의 주소로 채워지며 어디에서 추측 할 권한이 없습니다.

NSError *에만 포인터를 전달할 수 있습니다. 다른 것은 잘못되었습니다.

NSError가 자동으로 해제된다고 가정해야합니다. 그것은 싱글 톤일 수 있으며, 대체 번호가 될 수 있습니다. 당신이 알아야 할 것은 '당신은 그것을 지키지 않았고, 그것을 풀 필요가 없습니다.'라는 것입니다.

+0

소유권 정책 (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html # // apple_ref/doc/uid/20000043-SW1)은 copy/alloc/new가 소유권을 암시하며 소유권을 명시 적으로 선언하는 메소드를 사용합니다. – outis

+0

타사는이 정책을 따르지 않아도되지만 반환하기 전에 만든 NSError를 자동 릴리스하는 것이 좋습니다 (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError). .html # // apple_ref/doc/uid/TP40001806-CH204-SW5) – outis

+0

따라서 "일반적으로 자동 등록"및 "일반 규칙". – outis

관련 문제