Mercurial > sdl-ios-xcode
view Xcode/package @ 3487:24d13328c44a
Eric Wing to Sam, hfutrell
This one is quite puzzling. I found a partial workaround, but I don't fully understand the reasons yet.
First, the console is complaining about not finding a nib for MainWindow.
I tried removing the entry for this in the info.plist, and the message went away, but it didn't really change anything.
Second, I stepped through this with the debugger and broke up some lines. It seems that the basic act of calling
view = [SDL_uikitopenglview alloc];
or even
view = [SDL_uikitview alloc]
will crash the program. The debugger messages plus the stack trace make me think it's not finding the SDL_uikitview classes for some reason. But I don't understand why this would be.
view = [UIView alloc] will not crash the program.
For kicks, I added a new definition of a class called SDL_object which subclasses NSObject in the same files as SDL_uikitopenglview and then call
view = [SDL_object alloc];
This does not crash the program.
So, then I modified SDL_object to subclass UIView. No crash.
Next, I made SDL_object subclass UIView<UITextFieldDelegate> . This crashes.
So it is the act of conforming to the UITextFieldDelegate protocol that is crashing things.
I don't understand why it would crash on alloc though. I'm guessing either a delegate needs to be set somewhere or one of the required methods needs to be implemented. But in the former case, I would not expect a crash, but a silent message to nil and something else doesn't work. And in the latter case, I would expect a compiler warning and an exception thrown instead of a crash.
Anyway, my temporary workaround is to change the interface declaration for SDL_uikitview to look like:
#if SDL_IPHONE_KEYBOARD
@interface SDL_uikitview : UIView<UITextFieldDelegate> {
#else
@interface SDL_uikitview : UIView {
#endif
And then disable the keyboard support in the SDL_config_iphoneos.h file.
/* enable iPhone keyboard support */
#define SDL_IPHONE_KEYBOARD 0
-Eric
On Nov 23, 2009, at 1:43 AM, Sam Lantinga wrote:
> I ran into a blocking startup crash with the Happy demo on iPhone OS 3.1.2 on my new iPhone:
>
> #0 0x323fea14 in _class_isInitialized
> #1 0x323fea68 in _class_initialize
> #2 0x32403e92 in prepareForMethodLookup
> #3 0x32401244 in lookUpMethod
> #4 0x323fea10 in _class_lookupMethodAndLoadCache
> #5 0x323fe746 in objc_msgSend_uncached
> #6 0x323feb26 in _class_initialize
> #7 0x323fea58 in _class_initialize
> #8 0x32403e92 in prepareForMethodLookup
> #9 0x32401244 in lookUpMethod
> #10 0x323fea10 in _class_lookupMethodAndLoadCache
> #11 0x323fe746 in objc_msgSend_uncached
> #12 0x000554dc in UIKit_GL_CreateContext at SDL_uikitopengles.m:103
> #13 0x0004f89e in SDL_GL_CreateContext at SDL_video.c:3155
> #14 0x000579e8 in GLES_CreateRenderer at SDL_renderer_gles.c:282
> #15 0x0004d7b8 in SDL_CreateRenderer at SDL_video.c:1509
> #16 0x00002bc2 in SDL_main at happy.c:156
> #17 0x000571b2 in -[SDLUIKitDelegate postFinishLaunch] at
> SDL_uikitappdelegate.m:77
> #18 0x313f9ef2 in __NSFireDelayedPerform
> #19 0x32567bb2 in CFRunLoopRunSpecific
> #20 0x3256735c in CFRunLoopRunInMode
> #21 0x32912cbe in GSEventRunModal
> #22 0x32912d6a in GSEventRun
> #23 0x32b6276e in -[UIApplication _run]
> #24 0x32b61472 in UIApplicationMain
> #25 0x00057088 in main at SDL_uikitappdelegate.m:50
>
> Any ideas?
>
> See ya!
> --
> -Sam Lantinga, Founder and President, Galaxy Gameworks LLC
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 24 Nov 2009 08:12:32 +0000 |
parents | d63e9f5944ae |
children |
line wrap: on
line source
#! /bin/csh -ef set prog = `/usr/bin/basename $0` set usage = "Usage: $prog [-f] root-dir info-file [tiff-file] [-d dest-dir] [-r resource-dir] [-traditional | -gnutar]" set noglob if (-x /usr/bin/mkbom) then set mkbom=/usr/bin/mkbom set lsbom=/usr/bin/lsbom else set mkbom=/usr/etc/mkbom set lsbom=/usr/etc/lsbom endif if (-x /usr/bin/awk) then set awk=/usr/bin/awk else set awk=/bin/awk endif set gnutar=/usr/bin/gnutar set tar=/usr/bin/tar set pax=/bin/pax # gather parameters if ($#argv == 0) then echo $usage exit(1) endif while ( $#argv > 0 ) switch ( $argv[1] ) case -d: if ( $?destDir ) then echo ${prog}: dest-dir parameter already set to ${destDir}. echo $usage exit(1) else if ( $#argv < 2 ) then echo ${prog}: -d option requires destination directory. echo $usage exit(1) else set destDir = $argv[2] shift; shift breaksw endif case -f: if ( $?rootDir ) then echo ${prog}: root-dir parameter already set to ${rootDir}. echo $usage exit(1) else if ( $#argv < 2 ) then echo ${prog}: -f option requires package root directory. echo $usage exit(1) else set rootDir = $argv[2] set fflag shift; shift breaksw endif case -r: if ( $?resDir ) then echo ${prog}: resource-dir parameter already set to ${resDir}. echo $usage exit(1) else if ( $#argv < 2 ) then echo ${prog}: -r option requires package resource directory. echo $usage exit(1) else set resDir = $argv[2] shift; shift breaksw endif case -traditional: set usetar unset usegnutar unset usepax breaksw case -gnutar: set usegnutar unset usepax unset usetar case -B: # We got long file names, better use bigtar instead #set archiver = /NextAdmin/Installer.app/Resources/installer_bigtar echo 2>&1 ${prog}: -B flag is no longer relevant. shift breaksw case -*: echo ${prog}: Unknown option: $argv[1] echo $usage exit(1) case *.info: if ( $?info ) then echo ${prog}: info-file parameter already set to ${info}. echo $usage exit(1) else set info = "$argv[1]" shift breaksw endif case *.tiff: if ( $?tiff ) then echo ${prog}: tiff-file parameter already set to ${tiff}. echo $usage exit(1) else set tiff = "$argv[1]" shift breaksw endif default: if ( $?rootDir ) then echo ${prog}: unrecognized parameter: $argv[1] echo $usage exit(1) else set rootDir = "$argv[1]" shift breaksw endif endsw end # check for mandatory parameters if ( ! $?rootDir ) then echo ${prog}: missing root-dir parameter. echo $usage exit(1) else if ( ! $?info) then echo ${prog}: missing info-file parameter. echo $usage exit(1) endif # destDir gets default value if unset on command line if ( $?destDir ) then /bin/mkdir -p $destDir else set destDir = . endif # derive the root name for the package from the root name of the info file set root = `/usr/bin/basename $info .info` # create package directory set pkg = ${destDir}/${root}.pkg echo Generating Installer package $pkg ... if ( -e $pkg ) /bin/rm -rf $pkg /bin/mkdir -p -m 755 $pkg # (gnu)tar/pax and compress root directory to package archive echo -n " creating package archive ... " if ( $?fflag ) then set pkgTop = ${rootDir:t} set parent = ${rootDir:h} if ( "$parent" == "$pkgTop" ) set parent = "." else set parent = $rootDir set pkgTop = . endif if ( $?usetar ) then set pkgArchive = $pkg/$root.tar.Z (cd $parent; $tar -w $pkgTop) | /usr/bin/compress -f -c > $pkgArchive else if ( $?usegnutar ) then set pkgArchive = $pkg/$root.tar.gz (cd $parent; $gnutar zcf $pkgArchive $pkgTop) else set pkgArchive = $pkg/$root.pax.gz (cd $parent; $pax -w -z -x cpio $pkgTop) > $pkgArchive endif /bin/chmod 444 $pkgArchive echo done. # copy info file to package set pkgInfo = $pkg/$root.info echo -n " copying ${info:t} ... " /bin/cp $info $pkgInfo /bin/chmod 444 $pkgInfo echo done. # copy tiff file to package if ( $?tiff ) then set pkgTiff = $pkg/$root.tiff echo -n " copying ${tiff:t} ... " /bin/cp $tiff $pkgTiff /bin/chmod 444 $pkgTiff echo done. endif # copy resources to package if ( $?resDir ) then echo -n " copying ${resDir:t} ... " # don't want to see push/pop output pushd $resDir > /dev/null # get lists of resources. We'll want to change # permissions on just these things later. set directoriesInResDir = `find . -type d` set filesInResDir = `find . -type f` popd > /dev/null # copy the resource directory contents into the package directory foreach resFile (`ls $resDir`) cp -r $resDir/$resFile $pkg end pushd $pkg > /dev/null # Change all directories to +r+x, except the package # directory itself foreach resFileItem ($directoriesInResDir) if ( $resFileItem != "." ) then chmod 555 $resFileItem endif end # change all flat files to read only foreach resFileItem ($filesInResDir) chmod 444 $resFileItem end popd > /dev/null echo done. endif # generate bom file set pkgBom = $pkg/$root.bom echo -n " generating bom file ... " /bin/rm -f $pkgBom if ( $?fflag ) then $mkbom $parent $pkgBom >& /dev/null else $mkbom $rootDir $pkgBom >& /dev/null endif /bin/chmod 444 $pkgArchive echo done. # generate sizes file set pkgSizes = $pkg/$root.sizes echo -n " generating sizes file ... " # compute number of files in package set numFiles = `$lsbom -s $pkgBom | /usr/bin/wc -l` # compute package size when compressed @ compressedSize = `/usr/bin/du -k -s $pkg | $awk '{print $1}'` @ compressedSize += 3 # add 1KB each for sizes, location, status files @ infoSize = `/bin/ls -s $pkgInfo | $awk '{print $1}'` @ bomSize = `/bin/ls -s $pkgBom | $awk '{print $1}'` if ( $?tiff ) then @ tiffSize = `/bin/ls -s $pkgTiff | $awk '{print $1}'` else @ tiffSize = 0 endif @ installedSize = `/usr/bin/du -k -s $rootDir | $awk '{print $1}'` @ installedSize += $infoSize + $bomSize + $tiffSize + 3 # echo size parameters to sizes file echo NumFiles $numFiles > $pkgSizes echo InstalledSize $installedSize >> $pkgSizes echo CompressedSize $compressedSize >> $pkgSizes echo done. echo " ... finished generating $pkg." exit(0) # end package