我想在启动画面上显示UIActivityIndicatorView。 我只是在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];
}
除内存泄漏外,它工作正常。 我在控制台中收到消息,自动释放,没有池到位 - 只是泄漏。 我做错了什么? 任何帮助将不胜感激。
答案 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)
这里有几个问题。您需要释放您分配的任何内容。变量splashview
,splashImageView
和progressIndicator
已分配但未发布,因此会泄漏。
您获得的有关NSAutoreleasePool的消息是因为您在单独的线程上执行getInitialData:
。 NSAutoreleasePool
是每线程的,所以你需要这样做:
-(void)getInitialData:(id)obj {
NSAutoreleasePool pool = [NSAutoreleasePool new];
[NSThread sleepForTimeInterval:3.0];
[splashView removeFromSuperview];
[window addSubview:viewController.view];
[pool release];
}