2009-11-13 3 views
1

다음은 NSNumber를 사용하여 assign (사용하는 NSNumber가 객체 임)입니다. NSNumber에 대한 @property 속성?

@property(assign) NSNumber *mass; 

은 내가 릴리스를 추가해야 유지 사용 또한 경우,하지만 난이 ALLOC와의 NSNumber를 만든 경우 내가 한 번 유지를 위해 한 번 ALLOC를 들어, 두 번 해제 할 필요가 없습니다 것?

@property(retain) NSNumber *mass; 
mass = [[NSNumber alloc] numberWithInt:5]; 

게리

+0

의견에 대한 첫 번째 감사, 귀하의 권리 인 numberWithInt와 alloc이 잘못되었습니다. 저는 이것을 메모리에서 썼고 구문을 엉망으로 만들었습니다. – fuzzygoat

답변

2

혼란은 Objective-C 2.0 속성과 메모리 관리의 두 가지 개념에서 유래합니다.

할당 또는 유지 사용 여부는 수행하려는 작업과 가비지 수집 사용 여부에 따라 결정됩니다. 예를 들어 가비지 수집을 사용하지 않고 할당을 사용 중이면 [NSNumber numberWithInt:0]으로 질량을 설정하면 (자동 프리 한) NSNumber 인스턴스가 사라지고 다음에 사용하려고 할 때 문제가 발생합니다.

두 번째 코드 블록에 필요한 릴리스 수와 관련하여 정말로 메모리 관리 설명서를 다시 읽어야합니다. 문서에서 언급 한 방법을 사용하여 개체를 만든 경우 개체를 릴리스해야합니다. 그게 전부 야. 그것을 유지하든 그렇지 않든간에 "귀하의 비즈니스는 없음"입니다. 따라서 논리에 따라 대량 속성이 값을 유지하고 적절히 릴리스하면 @synthesize을 사용하거나 적절한 접근 자 설정 예제를 따르는 경우에도 자체 비즈니스를 잘 처리 할 수 ​​있습니다. 다시 말하지만, 객체를 생성하면 객체를 릴리즈해야합니다. 다른 사람들은 필요에 따라 객체를 보유/해제 할 수 있지만 이는 사용자의 우려를 초월합니다.

또한 [[NSNumber alloc] numberWithInt:5]이 잘못되었습니다. 당신은 alloc/init ...하지만 alloc하지 않고, 편의 메소드 (아마도 alloc/init ... 인스턴스 자체)를 호출한다.

+0

감사합니다. Joshua, 메모리 관리 가이드 2 단원을 읽었지만 Objective-C 및 Cocoa를 처음 사용하는 사람은 당신의 명확한 대답을 위해 많은 감사합니다, 나는 내가 지금 어디에 있는지에 근거하여 나의 지식을 새롭게하기 위해 또 다른 읽을 것을 갖게 될 것입니다. – fuzzygoat

+0

초기 혹을 극복하는 것은 어렵습니다. 일단 당신이 "그것을"얻으면, 대부분의 경우에 쉽게된다. –

+0

또한,'numberWithInt :'는 클래스 메소드입니다. 그 메시지를'alloc'의 결과로 보내면 그것을 * instance *로 보냅니다. –

5

당신은 일반적으로 인스턴스 변수를 retain하려는, 그래서 그들은 예기치 않게에서 증발하지 않습니다. 귀하의 라인 :

mass = [[NSNumber alloc] numberWithInt:5]; 

약간 이상합니다.

mass = [NSNumber numberWithInt:5]; 
mass = [[NSNumber alloc] initWithInt:5]; 

첫 번째는 되돌려 오토 릴리즈 NSNumber 개체, 두 번째 유지되었습니다 NSNumber 당신을 제공합니다 : 당신은 아마 이들 중 하나 싶다. 내가 당신이 정말로 찾고있는 기대하는 것은 이것이다 :

@property(retain) NSNumber *mass; 
self.mass = [NSNumber numberWithInt:5]; 
+1

ㅎ - 그냥 내 자신을 게시했다. 나는 [[NSNumber alloc] numberWithInt : 5]가 단지 "이상한"것이 아니라는 점을 지적하는 것이 중요하다고 생각합니다. 그것은 잘못되었습니다. –

+0

나는 그것이 실제 코드가 아니라 복사/붙여 넣기/재 작성 - 스택 오버 플로우 문제가되기를 바랬다. 당신 말이 맞아요. 심지어 컴파일할지 궁금해? –

+0

대답은 '예'입니다. 테스트 결과 경고가 나오지 않습니다. 런타임시 NSInvalidArgumentException과 충돌합니다. –

0

, 그러나 당신이 다른 클래스를 유지하기 위해 필요로하고 요구에 그것을 건네 클래스가 전무로 설정하는 것을주의해야 당신은 할당을 사용할 수 있습니다 NSNumber 객체를 해제 할 때.

당신이 속성을 유지하고, 당신이 재산을 드릴 것입니다 다음을 쓸 수 있도록하는 경우가 하나의 retainCount :

self.mass = [NSNumber numberWithInt:5]; 

또는

mass = [[NSNumber alloc] initWithInt:5]; 
// no "self." also note that the message is "init..." 

또는

NSNumber *num = [[NSNumber alloc] initWithInt:5]; 
self.mass = num; 
[num release]; 

retain 속성을 설정하면 "인스턴스"를 통해 설정된 경우에만 retainCount가 증가합니다. 또는 "자기.".

+0

동일 함 모든 객체에 대해 동일하게 적용됨 또한 "self"의 dealloc 메소드에서 대량을 릴리스하는 것을 기억하십시오. – FelixLam

0

의 NSNumber 및 다른 불변 오브젝트는 사용 self.mass = [NSNumber numberWithInt:5]; 할당시 @property(retain) NSNumber *mass;

(가변 객체 복사본을 사용한다)이어야한다. 이 메소드는 new, copy, init를 포함하지 않으므로 자동으로 릴리즈 된 객체를 반환합니다. self.을 사용하면 setter를 호출하고 값을 유지합니다.

Memory management rules을 읽으십시오.