2013-02-12 4 views
0

iPhone 앱 개발에 XCode를 사용하고 있습니다. 이 플랫폼을 처음 사용하고 특정 문제에 대한 도움이 필요합니다 ...NSMutableArray로 인해 충돌이 발생합니다.

데이터를 처리하고 NSMutableArray로 래핑 된 NSNumber로 두 정수 값을 반환하는 메서드가 있습니다.

-(NSMutableArray *)processPoints:(int) x:(int) y 
{ 
NSMutableArray *mutArray = [[NSMutableArray alloc] initWithCapacity:3]; 
int x9,y9; 

// ...do some processing... 

NSNumber* xNum = [NSNumber numberWithInt:x9]; 
NSNumber* yNum = [NSNumber numberWithInt:y9]; 

[mutArray addObject:xNum]; 
[mutArray addObject:yNum]; 

    return [mutArray autorelease]; 
} 

난 로컬 변수로의 NSNumber 물건을 복사하고 NSMutable 어레이의 로컬 복사를 방출하는 다른 방법에서 상기 메소드를 호출 여기

는 방법이다.

하지만이 NSMutable 배열 (변수 'mutArray')을 공개하면 앱이 다운됩니다. I 메모리 해제의 과정을 잘못 하겠어 어디

-(void)doNinjaAction 
{ 
    NSMutableArray* mutArray = [self processPoints: x :y]; 

    NSNumber* s1 = [[mutArray objectAtIndex:0] retain]; 
    NSNumber* s2 = [[mutArray objectAtIndex:1] retain]; 

    x = [s1 integerValue]; 
    y = [s2 integerValue]; 

    //...proceed with other stuff... 

    [mutArray autorelease]; //this is where the system crashes. same for 'release'    
          //instead of 'autorelease' 
    } 

당신이 설명해 주시겠습니까 : 여기

는 방법이다.

내 프로세스에 대한 이해는 약간 불안정합니다. 도와주세요. 당신이 문을

NSMutableArray* mutArray = [self processPoints: x :y]; 

를 호출 할 때

+0

두 번 자동으로 해제하기 때문에 충돌합니다. –

답변

1

이 자체는 오토 릴리즈 역할을합니다.

따라서 배열을 명시 적으로 해제하면 앱이 중단됩니다.

+0

알았어 ... 고마워. – metsburg

0

mutArray를 한 번 이상 내 보냅니다. 한 번 processPoints에서 다시 doNinjaAction의 기능을합니다. 당신은 배열을 overreleasing하고 있기 때문에

[mutArray autorelease]; 
+0

"보관 횟수를 인쇄하여 잘못된 부분을 이해할 수 있도록하십시오."- [그가 그렇게하면 혼란 스러울 수 있습니다.] (http://whentouserecount.com) –

+0

@ H2CO3 : 동의하십시오. 답변을 수정할 것입니다. 고맙습니다. – Rushi

+0

반갑습니다. 이 조언을 나누고 자하는 사람과이 링크를 공유하십시오 :) –

2

:

는 충돌 제거를 해결하려면. 당신은 processPoints:에 alloc-init을 넣은 다음 자동으로 풀어줍니다. 이것이 맞습니다. 이것이 소유권을 처분하는 방법입니다.

그 후에는 이 필요하지 않으므로을 자동으로 읽거나 다시 보내지 않아야합니다. 표준 라이브러리의 malloc()이 아닙니다.

+0

네, 이제 요점이 있습니다. 감사. – metsburg

0
-(NSMutableArray *)processPoints:(int) x:(int) y 
{ 
NSMutableArray *mutArray = [[NSMutableArray alloc] initWithCapacity:3]; 
int x9,y9; 

// ...do some processing... 

NSNumber* xNum = [NSNumber numberWithInt:x9]; 
NSNumber* yNum = [NSNumber numberWithInt:y9]; 

[mutArray addObject:xNum]; 
[mutArray addObject:yNum]; 

[mutArray autorelase]; 
    return mutArray; 
} 

이것을 시도하면 해결됩니다.

+0

예 .... 두 번째 시간도 공개하지 않으면 정상적으로 작동합니다. 고마워. – metsburg

-1

@ H2CO3 및 @AppleDelegate가 제안했듯이, 맞습니다.

여전히 ARC를 사용하고 ARC를 사용하도록 프로젝트를 변환하는 것이 좋습니다. 편집 -> Refactor-에

이동>는 언제 어디서나 자료를 할 필요가없는

그런 Objectiv-C ARC로 변환합니다. 모든 릴리즈를 스스로 관리 할 것입니다.

+0

누구를 voteeddd 부정 할 수 있습니다 나는 남자를 알고 ?? 이유를 줘. – Bhupendra

+0

FYI ... 나는 위로 투표하려고 노력했다. .. 그러나 나는 허락받지 않는다. .. (( – metsburg

0
-(NSMutableArray *)processPoints:(int) x:(int) y 
{ 
NSMutableArray *mutArray =[[[NSMutableArray alloc] initWithCapacity:3]autorelease]; 
int x9,y9; 

// ...do some processing... 

NSNumber* xNum = [NSNumber numberWithInt:x9]; 
NSNumber* yNum = [NSNumber numberWithInt:y9]; 

[mutArray addObject:xNum]; 
[mutArray addObject:yNum]; 

    return mutArray; 
} 
관련 문제