문제

나는 iPhone 프로그래밍의 멍청이이며 머리를 감싸지 못한다는 예외가 발생합니다.

배경 : 오류는 사용자 정의 하위 뷰에서 발생하며 프로그램을로드 할 때 즉시 발생합니다. 재정의 된 DrawRect 메소드에서 예외가 발생합니다. 오류를 던지는 코드는 다음과 같습니다.

- (void)drawRect:(CGRect)rect{
    NSNumber *points = [NSNumber numberWithInt: star.numberOfPoints];
    //HERE. Doesn't recognize selector?!
    CGPathRef t = (CGPathRef)[starPaths objectForKey:points];
 /*snip*/

StarPaths는 Awakefromnib에서 용량 1을 갖는 nsmutabledictionary로 초기화됩니다.

던져지고있는 예외는 -[nsobject is notrecenizeseelector :

StarPaths는 뷰를 위해 헤더 파일에 선언됩니다.

    NSMutableDictionary *starPaths;

그리고 초기화됩니다

- (void)awakeFromNib{
    starPaths = [NSMutableDictionary dictionaryWithCapacity: 1];
} 

마지막으로, 나는 항목을 추가하는 코드가 사전으로부터 nil 응답을받는 데 의존하기 때문에 특정 항목이 필요한 것을 알기 때문에 사전에 요소를 성공적으로 추가하는 코드의 한 지점에 도달 할 수 없었습니다. 건축됩니다.

제안이 있습니까? 내가 제공해야 할 다른 정보가 있습니까? 어떤 도움이 전혀 도움이 될 것입니다. 나는 분명한 것을 놓친 것 같은 느낌이 들지만, 나는 운이 없으면 하루 종일 머리를 부딪쳤다.

도움이 되었습니까?

해결책

그리하지 않으면 retain 그만큼 starPaths 가변적 또는 명시 적으로 직접 할당됩니다 [[NSMutableDictionary alloc] initWithCapacity:1] 그런 다음 런 루프의 다음 반복에서 자동으로 릴리스됩니다.

당신은해야합니다

starPaths = [[NSMutableDictionary dictionaryWithCapacity:1] retain];

또는

starPaths = [[NSMutableDictionary alloc] initWithCapacity:1];

그냥 확인하십시오 release 더 이상 필요하지 않을 때.

다른 팁

확인해야 할 몇 가지 사항 :

  • StarPaths가 NSMutableDictionary* 인스턴스 변수로 선언됩니까? 당신은 그것이 초기화되었다고 언급합니다. DictionaryWithCapacity 메소드 (자동 방출 객체를 반환) 또는 InitWithCapacity (명시 적으로 유지해야 함)를 사용 했습니까? 안전하기 위해, 당신은 그것을 유지하고 완료되면 해제 할 수 있습니다.

  • 헤더 파일에 올바르게 포함되어 있는지 확인하려면 두 번 확인하여 스타 경로 선언이이를 사용하는 구현 파일에 포함됩니다.

  • 일반적으로 미스터리 오류가 발생하면 손상된 메모리와 관련이 있습니다. DrawRect 메소드의 첫 번째 줄에 중단 점을 작성하고 "po starPaths"Debugger Console Window에서 무엇이 있는지, 런타임이 어떤 유형의 객체를 생각하는지 확인합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top