Clang警告:永远不会读取在初始化期间存储到“池”的值

时间:2011-06-09 01:54:55

标签: objective-c ios clang

- (void)main {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Warning goes here

    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    while (YES) {
        NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init];
        [runLoop run];
        [subPool drain];
    }

    [pool drain];
}

我不明白为什么这段代码会出现这样的警告,特别是当它与Xcode本身生成的main.m中的main函数几乎完全相同时,它没有得到相同的警告:

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

1 个答案:

答案 0 :(得分:5)

我认为问题是while (YES)声明。 Clang认为这是一个永无止境的无限循环,因此永远不会触及该块下面的代码。

只需将其更改为以下内容(BOOL变量设置为块外的YES即可删除警告:

int main (int argc, const char * argv[])
{

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];

    BOOL keepRunning = YES;

    while (keepRunning) {
        NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init];
        [runLoop run];
        [subPool drain];
    }

    [pool drain];

    return 0;
}