在splashscreen中uiActivityindicatorView会产生内存泄漏问题?

时间:2011-09-28 17:55:06

标签: iphone splash-screen uiactivityindicatorview

我想在启动画面上显示UIActivityIndi​​catorView。 我只是在AppDelegate中的splashview上创建了一个splashView和activityindicator。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   

    //[NSThread sleepForTimeInterval:3];

    // Override point for customization after application launch.

    // Add the view controller's view to the window and display.

    splashView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

    UIImage *splashImage = [UIImage imageNamed:@"Splashimage.png"];
    splashImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
    splashImageView.image = splashImage;
    [splashView addSubview:splashImageView];

    progressIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(145,440,30,30)];
    progressIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
    [progressIndicator startAnimating];
    [splashView addSubview:progressIndicator];

    [self.window addSubview:splashView];
    [NSThread detachNewThreadSelector:@selector(getInitialData:) 
                         toTarget:self withObject:nil];


    [self.window makeKeyAndVisible];
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

    return YES;
}

- (void)getInitialData:(id)obj {
    [NSThread sleepForTimeInterval:3.0]; 
    [splashView removeFromSuperview];
    [window addSubview:viewController.view];
}

除内存泄漏外,它工作正常。 我在控制台中收到消息,自动释放,没有池到位 - 只是泄漏。 我做错了什么? 任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:0)

你似乎没有在这里发布任何东西。

答案 1 :(得分:0)

你真的需要制作ivar / properties吗?

UIActivityIndicatorView* progressIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(145,440,30,30)];
progressIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
[progressIndicator startAnimating];
[splashView addSubview:progressIndicator];
[progressIndicator release];              // release
[self.window addSubview:splashView];
[splashView release];      // release

以下内容并非我的业务:

  

我不知道,但我第一次看到有人正在添加   飞溅图像上的活动指示器。你为什么需要   splashImageView,您可以直接在plist中创建一个条目   LaunchImage密钥条目的文件

答案 2 :(得分:0)

您的线程方法getInitialData必须创建并释放自动释放池。这是针对主线程自动完成的,但不是针对您创建的任何额外线程。只需在方法的顶部添加:

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

这位于底部:

[localpool drain];

您收到错误消息的原因是因为viewController.view正在返回一个自动释放的对象,并且您在该线程上没有自动释放池。

答案 3 :(得分:0)

这里有几个问题。您需要释放您分配的任何内容。变量splashviewsplashImageViewprogressIndicator已分配但未发布,因此会泄漏。

您获得的有关NSAutoreleasePool的消息是因为您在单独的线程上执行getInitialData:NSAutoreleasePool是每线程的,所以你需要这样做:

-(void)getInitialData:(id)obj {
    NSAutoreleasePool pool = [NSAutoreleasePool new];
    [NSThread sleepForTimeInterval:3.0]; 
    [splashView removeFromSuperview];
    [window addSubview:viewController.view];
    [pool release];
}