2010-02-03 4 views
1

기본적으로 문제는 제목이 말하는 것과 정확히 같습니다.iPhone : [NSBundle mainbundle] 호출은 시뮬레이터가 아닌 기기에서 충돌 함

내 응용 프로그램이 충돌없이 시뮬레이터에서 원활하게 작동합니다. 사실, 이전 버전은 앱 스토어에 있습니다. 나는 여기저기서 사소한 변화를 일으켰고 갑자기 아주 이상한 곳에서 충돌하기 시작했다.

나는 ... 그것을 반환 어느 시점에서, 그러나, NSBundle mainBundle]에 처음 몇 통화가 완전히 정상으로 expected-있는 등 PLIST 파일, 이미지에 액세스하는 코드의 다양한 장소에서 [NSBundle mainBundle] resourcepath]를 사용

-[NSBundle < null selector>]: unrecognized selector sent to instance 0x10a0e0 

... 장치에서 충돌합니다. 여기에 정확한 코드입니다 : 그 전화가 정말 문제가있는 경우

-(void) setImageName:(NSString *)s 
{ 
[imageName release]; 
imageName = [s copy]; 
NSLog(@"last line before crash"); 
NSString *imagePath =[[NSBundle mainBundle] resourcePath]; 
NSLog(@"Why would it crash before here???"); 

    imagePath = [imagePath stringByAppendingString:imageName]; 
    imageUI = [[UIImage alloc] initWithContentsOfFile:imagePath]; 
    [self setNeedsDisplay]; 
} 

확인하려면, 내가 이제까지 처음 몇 통화가 I로 완전히 정상이었다 (프로젝트에 [NSBundle mainbundle]에 전화를 처음의 문자열로 resourcePath 저장 위에서 언급 한) 그 resourcePath 문자열을 사방에 필요로했다 [NSbundle mainbundle]와 voila! 아무런 충돌/누출, 아무것도 ...

나는 완전히 혼란스러워. 왜 그 장치에 내 응용 프로그램이 충돌하지만 시뮬레이터가 아닌가요?

편집 :

NSArray *array = [NSBundle allBundles]; 
NSBundle *bundle = [array objectAtIndex:0]; 
NSString *imagePath = [bundle bundlePath]; 

사용 ... ... 대신 [[NSBundle mainBundle] resourcePath]도 작동합니다. 나는 어떻게 든이 특별한 통화에만 영향을주는 것을하고 있다고 생각합니다.

편집 2은 : 여기에서 중단 점을 설정 역 추적하다 - [NSObject의 doesNotRecognizeSelector :]

#0 0x30e27b98 in -[NSObject doesNotRecognizeSelector:] 
#1 0x30dacb18 in ___forwarding___ 
#2 0x30da3840 in __forwarding_prep_0___ 
#3 0x0000bcfe in -[CustomTableViewCell setImageName:] at CustomTableViewCell.m:93 
#4 0x0000499e in -[RootTableViewController tableView:willDisplayCell:forRowAtIndexPath:] at RootTableViewController.m:469 
#5 0x3364d5d0 in -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] 
#6 0x3364cde0 in -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] 
#7 0x335f832c in -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow] 
#8 0x335f6514 in -[UITableView layoutSubviews] 
#9 0x335f22d8 in -[UIView(CALayerDelegate) _layoutSublayersOfLayer:] 
#10 0x32bac1c0 in -[CALayer layoutSublayers] 
#11 0x32babedc in CALayerLayoutIfNeeded 
#12 0x32bab844 in CA::Context::commit_transaction 
#13 0x32bab474 in CA::Transaction::commit 
#14 0x32bb35dc in CA::Transaction::observer_callback 
#15 0x30da1830 in __CFRunLoopDoObservers 
#16 0x30de9346 in CFRunLoopRunSpecific 
#17 0x30de8c1e in CFRunLoopRunInMode 
#18 0x332e7374 in GSEventRunModal 
#19 0x335adc30 in -[UIApplication _run] 
#20 0x335ac230 in UIApplicationMain 

... 어디 # 3 - CustomTableViewCell.m : 93이되어있는 NSString * = IMAGEPATH [[NSBundle mainBundle] resourcePath]; 위에서 게시 한 코드 부분에서

+0

당신은 어디에서나 [NSBundle mainBundle]'에서 반환 된 객체를 공개하고 있습니까? – kubi

+1

'- [NSObject doesNotRecognizeSelector :]'에 중단 점을 설정하고 백 트레이스를 게시하십시오. – Chuck

+0

@chuck - Thx하지만 중단 점을 어디에 놓아야하는지 이해하지 못했습니다. –

답변

1

시뮬레이터가 아닌 장치의 충돌 (및 그 반대)은 일반적으로 하나의 하드웨어 플랫폼 만 준수하지만 다른 모듈은 그렇지 않은 컴파일 된 라이브러리/프레임 워크 때문에 발생합니다. 시뮬레이터는 인텔과 장치를 작동 시키므로 이상한 충돌이 발생합니다. 최근에 컴파일하지 않은 항목을 추가했는지 확인하십시오.

오류 -[NSBundle < null selector>]: unrecognized selector sent to instance 0x10a0e0NSBundle 클래스가 "잊어 버린"이유가 무엇이든간에 mainBundle 메서드를 사용한다고 제안합니다. 우리가 메모리 관련 오류에서 예상하는 것처럼 그것은 객체가 아닌 null 인 selector입니다. 그것은 어느 정도 수준 높은 부패를 제안합니다.

나는 정말 갑자기 mainBundle 선택을 잃는 경우이 당신을 말할 것이다 [NSBundle mainBundle];

NSLog(@"responds to selector mainBundle=%@",[NSBundle respondsToSelector:@selector(mainBundle)][email protected]"YES":@"NO"); 

를 호출하기 전에 다음과 같은 로그를 둘 것입니다.

Edit01 : 귀하의 답변에 대한

감사합니다. 그것은 Nsbundle 그것이 mainbundle에 응답 할 수있는 상태 것 같다 "선택에 응답 mainBundle = YES"단지 [NSBundle mainBundle]로 충돌 호출

흠 전에 충돌이 원인이 충분히 나쁜해야합니다 잘못된 오류 코드가 반환됩니다. 이는 mainBundle을 호출하기 직전 또는 직후에 문제가있을 수 있음을 의미합니다.

크래시가 CustomTableViewCell에서 발생한다고 가정 할 때 펜촉의 문제라고 생각합니다. 너트에 정의 된 UITableViewCell의 하위 클래스가 있습니까? 펜촉에 이미지가 정의되어 있습니까? 어떤 파일 유형입니까? 다른 이미지 또는 다른 펜촉으로 동일한 오류가 발생합니까?

저는 핵심 단서가 시뮬레이터에서는 작동하지만 장치에서는 작동하지 않는다고 생각합니다. 하드웨어에 따라 다르게 작동하는 것을 찾아야합니다.

당신은 분명 여기 하드 하나있어.

+0

답변 해 주셔서 감사합니다. Nsbundle은 mainbundle에 응답 할 수 있다고 말합니다 : "[NSBundle mainBundle]에 대한 충돌 호출 직전에"selector mainBundle = YES "에 응답합니다. –

+0

더 많은 아이디어를 보려면 Edit01을 참조하십시오. – TechZen

+0

문제는 실제로 더 어렵습니다. 크래시를 유발하는 프로젝트의 특정 부분, 즉 CustomTableViewCell이 아닙니다. 나는 대신 표준 셀을 사용하여 프로젝트에서 CustomTableViewCell을 제거하고, 프로젝트의 [NSBundle mainbundle]에 대한 다음 호출을 다시 호출합니다 .- 그게 원인입니다 - 충돌을 일으키고 원래 게시물에 명시된대로 [NSBundle allBundles] 접근 방식이 작동합니다 . 실제로 나는이 오류에 붙어 있지 않다. 처음에 여기에 올린 직후에 움직여 진 ive는 그럼에도 불구하고 무엇이 오류를 일으키는지를 알고 싶어한다. 왜 나는 충돌 버전을 유지하고 여기에 제안 된 것들을 적용 할까? –

1

기본적으로 문제는 제목에 정확히 나와 있습니다. - 아니야. [NSBundle mainBundle]이 아니며,이 고장 났음을 보증합니다. 크래시는 코드의 다른 부분에서 잘못하고있는 것의 증상입니다. 예를 들어 나쁜 메모리 관리처럼.

+0

글쎄, 내가 어딘가에 오류가 있어야한다는 것에 동의하지만 왜 그 특정 코드 스 니펫에서 [[nsbundle mainbundle] resourcepath] 대신에 미리 정의 된 문자열을 사용할 때 충돌이 발생하지 않을까? 그리고 [NSBundle ] 자체가 정말로 이상하지 않은가? –

+0

예, 메모리 손상을 지적합니다. –

4

NSZombieEnabled를 켜면 문제가 실제로 어디에 있는지 알 수 있습니다.

+0

iphone objective-c world에 입장하면 내 가장 좋아하는 국기. 사과가이 언어를 구현한다는 (특이한) 패러다임의 필요성. – KevinDTimm

+2

이것이 실제로 작동하는지 보려면 관심이 있습니다. Ahmet이보고 한 오류는 대개 잘못된 메모리 관리와 관련이 없지만 그 밖의 무엇이 잘못 될 수 있는지를보기가 어렵습니다. – Chuck

+0

thx 대답하지만 난 이미 nszombie 시도하고 didnt 이외에 anyting - [NSBundle ] : –

0

한 가지 가능한 문제는 동일한 이유로 imageName을 두 번 전달한 경우 유지하기 전에 해제해야한다는 것입니다. 처음 두 줄을 다음과 같이 바꿀 수도 있습니다.

if (imageName != s) { 
    [imageName release]; 
    imageName = [s retain]; 
} 
+0

thx,하지만 밀접하게 imagename의 메모리 할당을 따르는. –

1

문서에 하드 코딩 경로 문자열을 사용하는 것은 좋지 않습니다. 경로가 변경됩니다 (일반적으로 각 빌드마다). 크래시가 진행되는 한 더 많은 코드를 보지 않고도 알기가 어렵습니다.그러나이 제안에 대해 살펴 :

대신

[imagePath stringByAppendingString:imageName]; 

당신이

[imagePath stringByAppendingPathComponent:imageName]; 

stringByAppendingPathComponent 특히 경로와 파일 이름을 처리에 적합 사용해야합니다.

+0

thx, 나는 이미 그 부분을 주석 처리하고 실제로 사용하지 않았고 여전히 충돌을 보았습니다. [nsbundle mainbundle] resourcepath]를 사용했습니다. –

1

언제든지 [NSBundle mainBundle] 할 수 있어야합니다. 첫 번째 시간을 잡기 위해 코드에 흩어져있는 방법, St3fan 상태가 문제가 될 수있는 메모리 관리 (예 : 메모리 손상 발생)를 무력화시키는 무언가에 가깝게 두는 것이 좋습니다.

관련 문제