Stack corrupted with @autoreleasepool (ARC, compiled with llvm 3.0, Fastest, Smallest [
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!
After (incidentally) reading LLVM vs. GCC for iOS development managed to fix the problem... ARMv6 is exactly for my iPod which was giving troubles. The "fix" is to disable thumb support for ARMv6 configuration only. Great, but weird...
链接地址: http://www.djcxy.com/p/72750.html上一篇: NSAutoreleasePool autorelease池如何工作?
下一篇: 堆栈被@autoreleasepool破坏(ARC,使用llvm 3.0编译,Fastest,Smallest [