2011-03-09 5 views
0

다음은 코드입니다. 나는 NSString으로 테스트했고, -1을 리턴했다. 그러나 NSMutableArray는 0입니다.왜 retainCount가 1 대신 0입니까?

NSMutableArray *items = [[NSMutableArray alloc] init]; 

for(int i=0;i<10;i++) 
{ 
    [items addObject:[Possession randomPossession]]; 
} 

/*for(int i=0;i<[items count];i++) 
{ 
    NSLog(@"%@", [items objectAtIndex:i]); 
}*/ 



//Using Fast Enumeration 
/*for(items in items) 
{ 
    NSLog(@"%@", items); 
}*/ 


NSLog(@"%d", [items retainCount]); 

반복적으로 배열을 사용하여 실수를했습니다. 올바른 하나는 이와 같아야합니다.

//Using Fast Enumeration 
    for(Possession *item in items) 
    { 
     NSLog(@"%@", item); 
    } 

그리고 당신은 심지어 디버깅을 위해, retainCount보고해서는 안)

+0

-1이 어디서 왔는지, 그리고 'NSString을 사용하여 테스트'한다는 것이 무엇을 의미하는지 명확하게 설명해 주시겠습니까? 감사! – wpearse

+0

코드에서 "for (items in items)"라고 말하는가? 왜냐하면 모든 것이 망가 졌을테니까. (특히 "items"는 코드의 끝 부분에서 같은 것을 의미하지 않으며 더 이상 NSMutableArray를 가리키고 있지 않습니다.) –

+0

Gareth McCaughan과 완전히 일치합니다 – makboney

답변

7

1. 예상대로 retainCount는 정상으로 돌아입니다. 혼란스러운 결과를 줄 수있는 내부 구현 세부 사항입니다.

B)이 :

for(items in items) 

거의 확실하다 하지 당신이 무슨 뜻인지 - 당신이 너무 반복자로 배열 객체 ("항목")를 사용하고 있습니다! 다음과 같음 :

for(Possession *item in items) 

더 좋을 것입니다.


갱신 :

당신은 애플의 documentation on fast enumeration의 예제의 일부를보고 할 수 있습니다. 루프 반복자 역할을하는 별도의 변수를 갖고 싶습니다. 배열 (for(items in items))에서 배열의 각 객체에 차례로 items을 설정하면 루프를 종료 할 때 itemsnil이됩니다!

+0

위의 주석 된 코드에서 변환하여 열거 형을 빠르게 시도함으로써 실제로 연습합니다. NSMutable 배열을 초기화 했으므로 항목에 Possession * 항목을 할 필요가 없다고 생각합니다. CMIIW. – sayzlim

+0

당신이 지적한대로 내가 실수 한 것처럼 보입니다. 위의 코드에 대한 새로운 Possession * 항목을 만들어야하는 이유를 설명해 주시겠습니까? – sayzlim

+0

@Sayz Lim, 당신은 새로운'Possession * item'을 만들지 않고 있습니다 ... 당신은 단지 그것을 저장할 새로운 변수를 만들고 있습니다. –

관련 문제