A small program which loads image and logs its size. It is compiled with ARC support, llvm 3.0. I run it on iPod 4.2 and get some funny numbers... The program is compiled in "Release" mode with "-Os" (default optimization for "Release" in xcode). This whole thing does NOT happen in Simulator. It looks to me that @autoreleasepool in combination with a loop corrupts stack... 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 output after I tap the screen once ("h" is WRONG when logged after tapping! The height of the image 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[])
{
//@autoreleasepool
//{
return UIApplicationMain(argc, argv, nil,
@"AppDelegate");
//}
}
Run the program and tap. Still 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 is not working for me :) Please help! Thank you!
CGImageGetWidth(image.CGImage)
,CGImageGetHeight(image.CGImage)
instead ofimage.size.width
,image.size.height
always gives correct values... Still, I want to know what is wrong with original code... – S