#iphone #objective-c #cocoa-touch #xcode #nsexception
#iPhone #objective-c #cocoa-touch #xcode #nsexception
Вопрос:
Я создал прямоугольную кнопку, при нажатии на которую пользователь переходит на свой iPod.
Я получаю эту ошибку, как только нажимаю кнопку при отладке. Я тщательно проверил код iPod, и, похоже, все правильно.
Вот ошибка отладчика, вызванного после создания экземпляра NSException
:
2011-04-23 18:42:11.580 iApp[1197:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter'
*** Call stack at first throw:
(
0 CoreFoundation 0x01369be9 __exceptionPreprocess 185
1 libobjc.A.dylib 0x0115e5c2 objc_exception_throw 47
2 CoreFoundation 0x01322628 [NSException raise:format:arguments:] 136
3 CoreFoundation 0x0132259a [NSException raise:format:] 58
4 Foundation 0x00065b12 -[NSURL(NSURL) initFileURLWithPath:] 90
5 iApp 0x000056f3 -[MainViewController setupApplicationAudio] 148
6 iApp 0x00005af0 -[MainViewController viewDidLoad] 78
7 UIKit 0x0037765e -[UIViewController view] 179
8 UIKit 0x00379012 -[UIViewController viewControllerForRotation] 63
9 UIKit 0x00374f76 -[UIViewController _visibleView] 90
10 UIKit 0x0060ea97 -[UIClientRotationContext initWithClient:toOrientation:duration:andWindow:] 354
11 UIKit 0x002f0ba8 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] 954
12 UIKit 0x00570948 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] 1053
13 UIKit 0x0037b982 -[UIViewController presentModalViewController:withTransition:] 3151
14 iApp 0x00002330 -[MainerViewController goImport:] 153
15 UIKit 0x002c9a6e -[UIApplication sendAction:to:from:forEvent:] 119
16 UIKit 0x003581b5 -[UIControl sendAction:to:forEvent:] 67
17 UIKit 0x0035a647 -[UIControl(Internal) _sendActionsForEvents:withEvent:] 527
18 UIKit 0x003591f4 -[UIControl touchesEnded:withEvent:] 458
19 UIKit 0x002ee0d1 -[UIWindow _sendTouchesForEvent:] 567
20 UIKit 0x002cf37a -[UIApplication sendEvent:] 447
21 UIKit 0x002d4732 _UIApplicationHandleEvent 7576
22 GraphicsServices 0x01b80a36 PurpleEventCallback 1550
23 CoreFoundation 0x0134b064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ 52
24 CoreFoundation 0x012ab6f7 __CFRunLoopDoSource1 215
25 CoreFoundation 0x012a8983 __CFRunLoopRun 979
26 CoreFoundation 0x012a8240 CFRunLoopRunSpecific 208
27 CoreFoundation 0x012a8161 CFRunLoopRunInMode 97
28 GraphicsServices 0x01b7f268 GSEventRunModal 217
29 GraphicsServices 0x01b7f32d GSEventRun 115
30 UIKit 0x002d842e UIApplicationMain 1160
31 iApp 0x00001b34 main 102
32 iApp 0x00001ac5 start 53
33 ??? 0x00000001 0x0 1
)
terminate
Комментарии:
1. не могли бы вы поместить свой код, подверженный сбоям?
2. В этом случае публикация кода, вызывающего ошибку, и просто исключения без полной трассировки, вероятно, была бы более полезной. В сообщении об ошибке говорится, что вы передаете
nil
аргумент-[NSURL initFileURLWithPath:]
; вы изучали это?3. Хорошо, это единственный экземпляр initfilewithurlwithpath … NSURL *newURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; self.soundFileURL = newURL; [Выпуск newURL];
4. Ура, исправлено.. Я не включил звуковой файл, глупый я!
5. Так,
soundFilePath
по-видимомуnil
, происходит по крайней мере некоторое время. Выясните, когда и почему, и вы решили свою проблему.
Ответ №1:
Если вы посмотрите на самую первую строку вашего отчета о сбое, в нем говорится, что вы передаете нулевую строку в метод NSURL initFileURLWithPath от NSURL:
'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter'
Из документации Apple.
Передача nil для этого параметра приводит к исключению.
Поэтому обязательно проверьте свою NSString перед отправкой в метод initFileURLWithPath,
NSURL* targetFileURL = nil ;
if(targetFilePath != nil)
{
targetFileURL = [[NSURL alloc] initFileURLWithPath:targetFilePath];
}
Комментарии:
1. Вы не хотите повторно объявлять
targetFileURL
; оставьтеNSURL *
в строке 4.2. Спасибо, все, что было, это то, что я забыл добавить sound.caf в проект — только добавил его в папку.