A small program that downloads an image and registers its size. It is compiled with support for ARC, llvm 3.0. I run it on iPod 4.2 and get some funny numbers ... The program is compiled in "Release" mode with "-O" (default optimization for "Release" in xcode). All this does not happen in the Simulator. It seems to me that @autoreleasepool combined with a loop decomposes the stack ... Please note that I had to isolate the problem for this post with this simple example.
---------> int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, @"AppDelegate"); } } @interface AppDelegate : UIWindow <UIApplicationDelegate> @end @implementation AppDelegate -(void)loadImageAndLogValues { // image from bundle 256x26 UIImage *image = [UIImage imageNamed:@"Image.png"]; for (int i = 0; i < 1; i++) { NSLog(@"size=%@", NSStringFromCGSize(image.size)); NSLog(@"w=%f", image.size.width); NSLog(@"h=%f", image.size.height); NSLog(@"------------------------"); } } -(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { self.frame = [UIScreen mainScreen].bounds; self.backgroundColor = [UIColor blueColor]; [self makeKeyAndVisible]; [self loadImageAndLogValues]; UIGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(loadImageAndLogValues)]; [self addGestureRecognizer:tap]; return YES; } @end <------------------
And this is the result after I press the screen once ("h" is WRONG when registering after clicking! Image height is 26 ...):
2011-10-21 01:54:48.677 Tmp[2522:307] size={256, 26} 2011-10-21 01:54:48.696 Tmp[2522:307] w=256.000000 2011-10-21 01:54:48.705 Tmp[2522:307] h=26.000000 2011-10-21 01:54:48.715 Tmp[2522:307] ------------------------ 2011-10-21 01:54:50.576 Tmp[2522:307] size={256, 26} 2011-10-21 01:54:50.582 Tmp[2522:307] w=256.000000 2011-10-21 01:54:50.589 Tmp[2522:307] h=256.000000 2011-10-21 01:54:50.595 Tmp[2522:307] ------------------------
Now I remove @autoreleasepool from main ():
int main(int argc, char *argv[]) {
Run the program and click. Still the wrong value for "h", but when calling "loadImageAndLogValues" directly from "application: didFinishLaunchingWithOptions:" ...
2011-10-21 02:02:08.222 Tmp[2544:307] size={256, 26} 2011-10-21 02:02:08.240 Tmp[2544:307] w=256.000000 2011-10-21 02:02:08.250 Tmp[2544:307] h=256.000000 2011-10-21 02:02:08.259 Tmp[2544:307] ------------------------ 2011-10-21 02:04:59.097 Tmp[2544:307] size={256, 26} 2011-10-21 02:04:59.103 Tmp[2544:307] w=256.000000 2011-10-21 02:04:59.109 Tmp[2544:307] h=26.000000 2011-10-21 02:04:59.115 Tmp[2544:307] ------------------------
So? ... ARC + llvm 3.0 + -Os + @autoreleasepool + for (;;) + image.size.width / height does not work for me :) Please help! Thanks!
debleek63
source share