3

NSMutableArray가 합성 된 속성으로 정의되어 있고 NSMutableArray의 새로 만든 인스턴스가 할당되었습니다. 그러나이 후에 NSMutableArray에 객체를 추가하려고 할 때마다 항상 내 응용 프로그램이 중단됩니다.적절한 초기화 후 추가 할 때 NSMutableArray가 충돌합니다.

Page.h

@interface Page : NSObject 
{ 
    NSString *name; 
    UIImage *image; 
    NSMutableArray *questions; 
} 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, retain) UIImage *image; 
@property (nonatomic, copy) NSMutableArray *questions; 
@end 

Page.m

@implementation Page 
@synthesize name, image, questions; 
@end 

관련 코드는

Page *testPage = [[Page alloc] init]; 
testPage.image = [UIImage imageNamed:@"Cooperatief leren Veenman-11.jpg"]; 
testPage.name = [NSString stringWithString:@"Cooperatief leren Veenman-11.jpg"]; 
testPage.questions = [[NSMutableArray alloc] init]; 
[testPage.questions addObject:[NSNumber numberWithFloat:arc4random()]]; 

디버거는 순간 내가 사용하는 것을 알 수 testPage.questions = [[NSMutableArray alloc] init]; testPage.questions 유형이 NSMutableArray *에서 __NSArrayL * (또는 __NSArrayI *, 확실하지 않음)으로 변경됩니다. 이 문제가 의심 스럽지만 극도로 이상하게 느껴집니다. 여기에 무슨 일이 일어나는 지 아는 사람이 있습니까?

답변

4

문제는 당신이 copy으로 속성을 선언했다는 것입니다. 이것은 당신의 세터가 이런 식으로 구현 될 것입니다 의미 : 여기

- (void) setQuestions:(NSMutableArray *)array { 
    if (array != questions) { 
    [questions release]; 
    questions = [array copy]; 
    } 
} 

키커는 그 경우 당신 -copy 배열 (불변 또는 변경 가능 여부), 당신은 항상 얻을 불변의 NSArray.

그래서,이 문제를 해결하는 대신 copyretain로 속성을 변경하고,이 메모리 누수 해결하기 :

testPage.questions = [[NSMutableArray alloc] init]; 

그것은해야한다 :

testPage.questions = [NSMutableArray array]; 
+0

흠, 그것이 그럴 것이라고 생각하지 않았지만 작동합니다! 나는 여기에 많은 질문들이 무언가가 가변적 일 때마다 복사본을 사용할 것을 제안하기 때문에'copy'를 사용했다. 감사 : D – SpacyRicochet

+0

@SpacyRicochet : 결과 속성 값이 * 불변 *인지 확인하려면'copy'를 사용하십시오. 'NSString' 속성으로 이것을 가장 자주 보았습니다 : 문자열 자체가 당신 밑에서 바뀔 수 없도록 복사합니다. 당신의 속성이 변경 가능하기로되어 있기 때문에, 당신은'copy'를 사용할 수 없습니다. :) –

+0

고마워요! 이것은 내가 알아내는 데 더 오래 걸렸을 것입니다. :) –

2

@property (nonatomic, copy)이 setter 선언 "copy"가 NSArray로 캐스트 되었기 때문에 왜 보유 또는 할당하지 않습니까? 어쨌든 유지하겠다.

+0

+1, 새 값은 NSArray로 캐스팅되지 않습니다. 이 메서드는 실제로 변경 불가능한 복사본을 만듭니다. –

+0

고마워요. BTW @property와 같은 지시문에서 어떤 코드가 생성되는지 확인하는 방법이 있습니까? – Michal

+0

원시 조립품을 보는 것 이외에는 그렇지 않습니다. –

1

또한 변경 가능한을 만들 수 있습니다 다음과 같은 복사 방법 :

- (void)setQuestions:(NSMutableArray *)newArray 
{ 
    if (questions != newArray) 
    { 
     [questions release]; 
     questions = [newArray mutableCopy]; 
    } 
} 
+0

나중에 이것에 대해서도 알아 냈습니다. 좋은 방법, 비록 내가 바꾸고 싶은 정상적인 배열을 반환하는 메서드에 사용합니다. – SpacyRicochet

관련 문제