2011-10-21 2 views
0

이미지를로드하고 크기를 기록하는 작은 프로그램입니다. ARC 지원, llvm 3.0으로 컴파일됩니다. 나는 iPod 4.2에서 실행하고 재미있는 숫자를 얻습니다 ... 프로그램은 "-Os"(xcode의 "Release"에 대한 기본 최적화)를 사용하여 "Release"모드로 컴파일됩니다. 이 모든 일은 시뮬레이터에서는 일어나지 않습니다. 루프와 결합 된 @autoreleasepool이 스택을 손상 시킨다는 것을 알게되었습니다 ...이 간단한 예제를 사용하여이 게시물의 문제를 분리해야했습니다.@autoreleasepool (ARC, llvm 3.0으로 컴파일, 가장 빠름, 가장 작은 [-Os])로 손상된 스택

---------> 

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 

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

가 그리고 이것은 내가 한 번 화면을 탭 한 후 출력 (! 태핑 후 로그인 할 때 "시간이"잘못된 이미지의 높이가 ... 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] ------------------------ 

, main()에서 @autoreleasepool을 제거합니다.

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

프로그램을 실행하고 누릅니다. 또 "시간"에 대한 잘못된 값하지만 직접에서 "loadImageAndLogValues"호출 할 때 "응용 프로그램 : didFinishLaunchingWithOptions를 :"...

그래서 ... ARC + LLVM 3.0 + -Os + @autoreleasepool +에 대한
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] ------------------------ 

(;;) + image.size.width/height가 나를 위해 작동하지 않습니다 :) 도와주세요! 고맙습니다!

+0

당신은 애플 버그보고 시스템에 버그를보고 있나요? –

+0

아니요.하지만 사과 개발자 포럼에 게시되었습니다. https://devforums.apple.com/message/564415#564415 답변이 없습니다. – debleek63

+0

아무도 알려진 바가 없다면 어떻게 해결할 수 있습니까? 일부 무작위 포럼에 대한 간단한 질문은 도움이되지 않습니다. 문제 보고서를 작성해야합니다. –

답변

1

(부수적으로) LLVM vs. GCC for iOS development을 읽으면 문제를 해결할 수 있습니다. ARMv6은 문제를 일으키는 제 iPod 용입니다. "수정"은 ARMv6 구성에 대해서만 엄지 지원을 비활성화하는 것입니다. ... 좋아,하지만 이상한

enter image description here

+0

예, 여기에 설명 된 컴파일러 버그와 동일한 원인과 해결책이있는 것 같습니다 : http://stackoverflow.com/questions/8391307/coordinates-all-wrong-on -iphone-3g-it-be-be-your-compiler – Clafou

관련 문제