Стек поврежден с помощью @autoreleasepool (ARC, скомпилировано с llvm 3.0, самый быстрый, самый маленький [-Os]) - PullRequest
0 голосов
/ 21 октября 2011

Небольшая программа, которая загружает изображение и записывает его размер. Он скомпилирован с поддержкой ARC, llvm 3.0. Я запускаю его на iPod 4.2 и получаю несколько забавных цифр ... Программа скомпилирована в режиме «Release» с «-Os» (оптимизация по умолчанию для «Release» в xcode). Все это не происходит в симуляторе. Мне кажется, что @autoreleasepool в сочетании со стеком повреждает цикл ... Обратите внимание, что мне пришлось изолировать проблему для этого поста в этом простом примере.

--------->

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

<------------------

И это вывод после того, как я коснулся экрана один раз («h» НЕПРАВИЛЬНО, когда вошел в систему после нажатия! Высота изображения 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] ------------------------

Теперь я удаляю @autoreleasepool из main ():

int main(int argc, char *argv[])
{        
        //@autoreleasepool
        //{
        return UIApplicationMain(argc, argv, nil,
                                 @"AppDelegate");
        //}    
}

Запустите программу и коснитесь. Все еще неправильное значение для "h", но при вызове "loadImageAndLogValues" непосредственно из "приложения: 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] ------------------------

Так? ... ARC + llvm 3.0 + -Os + @autoreleasepool + for (;;) + image.size.width / height не работает для меня :) Пожалуйста, помогите! Спасибо!

1 Ответ

1 голос
/ 18 ноября 2011

После (случайно) прочтения LLVM против GCC для разработки под iOS удалось решить проблему ... ARMv6 именно для моего iPod, который доставлял проблемы«Исправить» - отключить поддержку большого пальца только для конфигурации ARMv6.Отлично, но странно ...

enter image description here

...