문제

다음과 같이 숫자를 정의하고 있습니다.

NSNumber *nn0 = [NSNumber numberWithInt:0];

할당없이 잘 작동합니다. 내 이해는 숫자를 사용하면 Alloc 및 Init을 자동으로 호출한다는 것입니다.

기능이 끝날 때 풀려 나면 문제가 발생합니다.

[nn0 release];

런타임 오류가 발생합니다.

내 질문은 : nsnumber를 초기화하기 위해 숫자를 사용하는 경우 메모리 관리를 수행해야합니까?

도움이 되었습니까?

해결책

많은 유형에 대한 "편의 생성자"는 자동으로 "자동 엘러 드"인 객체를 생성합니다. 즉, 새로운 객체는 현재 nsautoreleasepool에 의해 유지됩니다. 이러한 객체를 수동으로 해제 할 필요가 없습니다. 현재 NSAutorEleasePool이 해제/배수되면 릴리스됩니다.

편의 생성자에 대한 설명과이를 위해 메모리를 관리하는 방법은이 페이지를 참조하십시오.

http://www.macdevcenter.com/pub/a/mac/2001/07/27/cocoa.html?page=3

다른 팁

핵심 메모리 관리 규칙을 따르십시오. 변수를 "소유"하는 경우 결국 소유권을 포기해야합니다. 귀하는 소유권을 가져옵니다 : 개체 (Alloc/New/Copy) 만들거나 구체적으로 소유권을 취하는 (유지). 이 모든 경우에, 당신은 그것을 공개해야합니다.

주위를 고집 할 물건이 필요한 경우 소유권을 가져야합니다. 따라서이 방법에 대한 번호 만 필요하다는 것을 알고 있다면 (배열이나 무엇이든 전달하는 것과 같은) 편의 방법을 사용하여 그대로 두십시오. 어떤 이유로 숫자를 유지하려면 (예를 들어 인스턴스 변수) 안전하게 할당/이 시작할 수 있습니다.

소유하지 않은 것을 공개하면 런타임 오류가 발생합니다.

규칙은 간단하고 예외는 거의 없습니다.

객체를 반환하는 셀렉터에 "new", "alloc", "retain"또는 "copy"라는 단어가있는 경우, 반환 된 객체를 소유하고 완료되면 해제 할 책임이 있습니다.

그렇지 않으면 당신은 그것을 소유하지 않습니다 그리고 그것을 공개해서는 안됩니다. 소유하지 않은 물체에 대한 참조를 유지하려면 전화해야합니다. -[NSObject retain] 그 경우. 당신은 이제 해당 인스턴스를 "소유"해야합니다. -[NSObject release] 당신이 그것으로 끝났을 때의 경우에. 따라서 귀하는 다음으로 반환 된 인스턴스를 소유하지 않습니다 -[NSNumber numberWithInt:] 전화해서는 안됩니다 -release 당신이 끝났을 때 그것에. 반환 된 인스턴스를 현재 범위를 넘어서 유지하려면 (실제로 현재의 수명을 넘어서 NSAutoreleasePool 인스턴스), 당신은해야합니다 -retain 그것.

REGEX 용어로 Peter Hosey는 그의 블로그. 메소드 선택기 가이 REGEX와 일치하는 경우 반환 된 객체 인스턴스를 소유합니다.

/^retain$|^(alloc|new)|[cC]opy/

물론, 결정적인 참조는입니다 코코아를위한 메모리 관리 프로그래밍 안내서.

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