2012-08-05 4 views
1

나는 다음과 같은 코드가 있습니다해제 객체 - 손실 값

for (j1 = 0; j1 <= 90; j1++) 
    { 
     Items[j1] = [[NSString alloc] initWithFormat:@""]; 
    } 

: 내 init 메소드에서 내가 할 글로벌 배열로 봉사 할 수있는 모든 방법을 위하는 .m 파일에

NSString *Items[91]; 

을 등

,369 ...

Items[40] = [NSString stringWithFormat:@"40. Pers:%g each", PersExemptions]; 
Items[41] [email protected]"blah blah"; 

: 어떤 점에서 다른 방법의 AA는 트리거 할 수있다

그리고 어떤 시점에서 다른 방법 BB가 트리거되고 항목 [40]에 대해 해제 된 개체가 표시되는 것을 볼 수 있습니다. 목표를 무효로 한 값을 잃어 버리는 것입니다. Grr.

나는 아이템 배열이 끝날 때까지 응용 프로그램을 통해 수정 된 값을 유지하고 init 메소드에서 사용한 initWithFormat을 사용한다고 가정합니다. Items는 C 스타일 배열이고 NSMutable 배열로 변환하는 것은 고통 스럽다는 것을 알고 있습니다.

감사합니다.

+0

표시된 코드가 문제를 설명하기에 충분하지 않습니다 (즉, 표시된 것과 아무런 문제가 없음). 이 문제는 'Items [40]'값을 삭제하는 일부 코드에서 발생할 수 있습니다. –

+0

다시 볼 수 있습니다, @ GregHewgill, 문제가 확실합니다. –

+1

뭔가를 놓친 것 같습니다. 내가 틀렸다는 것을 보여줘! –

답변

3

EDIT : @dasblinkenlight가 지적 하듯이 여기에서는 ARC를 사용하지 않는다고 가정합니다.

여기 NSString *의 배열 인 C 스타일 배열을 사용하고 있습니다.

문제는이를 수행 할 때 ...

stringWithFormat:

[NSString stringWithFormat:@"40. Pers:%g each", PersExemptions]

당신은 보유하고 있지 않습니다있는 NSString을 반환한다는 것입니다. 배열에있는 NSString을 잡고 싶다면 그것을 유지해야합니다. 당신이 자신 할 있는 NSString을 제공

Items[40] = [[NSString alloc] initWithFormat:@"40. Pers:%g each", PersExemptions];

: 또는 당신은 이전에했던 ALLOC/initWithString를 사용할 수 있습니다. 그러나 물론, 그것은 또 다른 버그로 이어집니다. 즉, 잠시 전에 NSString이 Items [40]에 있었던 모든 것을 유출했기 때문입니다.

항상 이전 문자열을 매번 릴리스 할 수 있는지 확인하거나 많은 노력을 절약하고 NSMutableArray를 대신 사용할 수 있습니다. NSMutableArray는 각각의 새 값을 유지하고 방금 교체 된 값을 릴리스하는 것을 처리합니다. 너무 많은 노력이 필요하다고 말하면서 다른 사람이 말할 수있는 코드를 보지 않아도되지만 실제로 저장하는 각 객체에 대한 회계는 실제로 일 수 있으며 더 많은 노력은입니다.

도움이 되었기를 바랍니다.지금있는 NSString

+2

당신은 ARC가 아니라고 가정합니다. – dasblinkenlight

+0

@dasblinkenlight 예, 맞습니다. 감사. –

+0

@Firoze Lafeer 내가 여기에 당연시 여기는 내부 작업을 이해하는 데 도움이되었다는 설명에 감사드립니다. C- 스타일 배열을 NSMutableArray로 변환 할 계획입니다. 아크 (ARC)에 관해서는, 나는 그 순간에 혜택을 줄 수있는 방법이나 이점을 확신 할 수 없기 때문에 그것에 대한 적절한 의무를 다할 것입니다. –

0

은 다음과 같습니다

NSString ** strArr; 
int rows = 91; 

그런 다음, 동적 할당의 malloc를 사용해야합니다 메모리 :

int i; 
strArr = malloc(rows * sizeof(strArr *)); 

for(i = 0; i < rows; i++) 
{ 
strArr[ i ] = calloc(columns, sizeof(NSString)); 
} 

당신의 dealloc 메소드에서 해제하는 것을 잊지 마세요 :

int i; 

for(i = 0; i < rows; i++) 
{ 
    free(strArr[ i ]); 
} 
free(strArr); 
+0

귀하의 응답을 주셔서 감사합니다, 나는 조금 더 objectice - C를 통합하는 것 같다 NSMutablearrays를 사용하는 것 같아요. –