I'd like to thank everyone for your input. I learned a lot from this thread.
BTW, simply changing the offending dictionary syntax to using the old API instead of the literals didn't help. I really had to abandon the singleton idea for the C++ wrapper object. Correct me if I'm wrong, please. I think Greg's post clarifies things: """ The initialization order is generally like this: 1. Everything in libraries you link to is initialized. 2. Your classes' +load methods run. Each class runs +load before its subclasses. (Timing of category +load is more complicated, but in most cases they also run now.) 3. Your C and C++ static constructors run. 4. main() """ The offending C++ wrapper and the ObjC implementation it wraps are both in a static library that the test app links to. According to the order above, the static constructor of the C++ wrapper actually runs after the wrapped ObjC object's dictionary is created, seems a problem to me. Thanks, Beinan On Fri, Oct 24, 2014 at 2:26 PM, Beinan Li <li.bei...@gmail.com> wrote: > 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