You nailed it, Kevin. Thanks so much! It is due to the static C++ wrapper object. After I moved it to the heap, the crash was fixed.
Thanks, Beinan On Thu, Oct 23, 2014 at 12:50 PM, Kevin Meaney <k...@yvs.eu.com> wrote: > Personally I'd try and not call any objective-c code from a C++ static > object. If it did look the appropriate solution then I'd make sure I was > comfortable with my knowledge of the objective-c runtime and the order in > which things are called before main is called. > > Kevin > > On 23 Oct 2014, at 13:02, Beinan Li <li.bei...@gmail.com> wrote: > > Thank you Kevin! > I didn't know this before. This might be it because I did at some point > change the dictionary creation from the old API-based syntax to literals. > Maybe I should move back to the API calls. I'll try that today. > > Thanks, > Beinan > > > On Thu, Oct 23, 2014 at 5:18 AM, Kevin Meaney <k...@yvs.eu.com> wrote: > >> >> On 23 Oct 2014, at 00:34, Beinan Li <li.bei...@gmail.com> wrote: >> >> Oh! I did actually. >> >> The method I posted belongs to an ObjC object which is wrapped by a C++ >> object. >> That C++ object is a singleton (static). >> >> How is this going to affect ARC and why it didn't down-right crash a week >> ago before I upgraded Xcode? >> >> >> I wouldn't worry about why it worked before. I don't think that helps, >> and if you have any other cases they should be removed as well. >> >> Array and dictionary literals are not evaluated at compile time but are >> replaced with the objective-c calls to create the arrays and dictionaries. >> This is very different to string literals. >> >> From what I understand any code that is executed before main is called is >> done so before the objective-c runtime is fully setup which means you have >> no guarantees about what will work. In objective-c++ where you can create >> static C++ objects that results in objective-c being called it is an easy >> way to make difficult to track crashes. >> >> I'd like confirmation from an apple engineer that my understanding is >> correct. My quick perusal of the docs didn't find the info I was after. >> >> Kevin >> >> Thanks, >> Beinan >> >> >> On Wed, Oct 22, 2014 at 7:00 PM, Kevin Meaney <k...@yvs.eu.com> wrote: >> >>> Your not creating a static C++ object anywhere are you? One that creates >>> the dictionary before main gets called by any chance? >>> >>> Kevin >>> >>> Sent from my iPhone >>> >>> > On 22 Oct 2014, at 22:45, Beinan Li <li.bei...@gmail.com> wrote: >>> > >>> > Note, the initial crashing function is merely translating a C++ enum >>> to the >>> > AVFoundation builtin constants. >>> > >>> > Thanks, >>> > Beinan >>> > >>> > >>> >> On Wed, Oct 22, 2014 at 5:45 PM, Beinan Li <li.bei...@gmail.com> >>> wrote: >>> >> >>> >> It is quite unpredictable. >>> >> At first it crashes at a dictionary creation line in a .mm >>> implementation >>> >> like this: >>> >> >>> >> - (NSString*) getAVAudioSessionMode:(myAudioSessionMode)modeKey { >>> >> NSDictionary* modeDict = @{ // Here it crashes >>> >> @(myAudioSessionModeDefault): AVAudioSessionModeDefault, >>> >> @(myAudioSessionModeVoiceChat): AVAudioSessionModeVoiceChat, >>> >> @(myAudioSessionModeGameChat): AVAudioSessionModeGameChat, >>> >> @(myAudioSessionModeVideoRecording): >>> AVAudioSessionModeVideoRecording, >>> >> @(myAudioSessionModeMeasurement): AVAudioSessionModeMeasurement, >>> >> @(myAudioSessionModeMoviePlayback): AVAudioSessionModeMoviePlayback, >>> >> @(myAudioSessionModeVideoChat): AVAudioSessionModeVideoChat >>> >> }; >>> >> NSString* mode = [modeDict objectForKey:@ >>> >> (mySettings.audioSession.eMode)]; >>> >> return mode; >>> >> } >>> >> >>> >> The backtrace gives me: >>> >> >>> >> * thread #1: tid = 0x2403, 0x0013148c MyDemo`-[MyImp >>> >> getAVAudioSessionMode:](self=0x1e839a80, _cmd=0x002d3077, >>> >> modeKey=myAudioSessionModeDefault) + 676 at MyImp.mm:78, queue = >>> >> 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, >>> address=0x0) >>> >> * frame #0: >>> >> 0x0013148c MyDemo -[MyImp getAVAudioSessionMode:](self=0x1e839a80, >>> >> _cmd=0x002d3077, modeKey=myAudioSessionModeDefault) + 676 at >>> MyImp.mm:78 >>> >> >>> >> Then if I remove this dictionary all together and do it like this: >>> >> >>> >> - (NSString*) getAVAudioSessionMode:(myAudioSessionMode)modeKey { >>> >> return AVAudioSessionModeDefault; >>> >> } >>> >> >>> >> Then I get a crash right in the main.mm: >>> >> >>> >> int retVal = UIApplicationMain(argc, argv, nil, @"MyDemoAppDelegate"); >>> >> >>> >> backtrace: >>> >> >>> >> * thread #1: tid = 0x2403, 0x3c4df350 >>> >> libsystem_kernel.dylib`__pthread_kill + 8, queue = >>> 'com.apple.main-thread', >>> >> stop reason = signal SIGABRT >>> >> frame #0: 0x3c4df350 libsystem_kernel.dylib`__pthread_kill + 8 >>> >> frame #1: 0x3c456122 libsystem_c.dylib`pthread_kill + 58 >>> >> frame #2: 0x3c492972 libsystem_c.dylib`abort + 94 >>> >> frame #3: 0x3ba30d4e libc++abi.dylib`abort_message + 74 >>> >> frame #4: 0x3ba2dff8 libc++abi.dylib`default_terminate() + 24 >>> >> frame #5: 0x3bfe1a >>> >> >> >> > > _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com