2011-12-19 45 views
0

在项目中,我创建了一个类viewTransistion奇怪和外来记忆行为

#import "viewTransition.h" 
#import "quiz.h" 
#import "mode.h" 
#import "result.h" 
#import "aboutGame.h" 
#import "ViewController.h" 


static UIView *cview=nil; 
static quiz *quizObj=nil; 
static mode *modeObj=nil; 
static result *resultObj=nil; 
static aboutGame *aboutGameObj=nil; 
static ViewController *viewControllerObj=nil; 


@implementation viewTransition 

+(void) viewsTransitionCurrentView:(id)currentView toNextView:(NSString*)nextViewName 
{ 
    if(nextViewName == @"quiz") 
    { 
     quizObj = [[quiz alloc]init]; 
     cview = quizObj.view; 

     NSLog(@"quizObj=%d", [quizObj retainCount]); 
    } 

    if(nextViewName == @"mode") 
    { 
     modeObj = [[mode alloc]init]; 
     cview = modeObj.view; 

     NSLog(@"modeObj=%d", [modeObj retainCount]); 
    } 

    if(nextViewName == @"result") 
    { 
     resultObj = [[result alloc]init]; 
     cview = resultObj.view; 

     NSLog(@"resultObj=%d", [resultObj retainCount]); 
    } 

    if(nextViewName == @"aboutGame") 
    { 
     NSLog(@"aboutGameObj=%d",[aboutGameObj retainCount]); 

     aboutGameObj = [[aboutGame alloc]init]; 

     cview = aboutGameObj.view; 
    } 

    if(nextViewName == @"viewController") 
    { 
     viewControllerObj = [[ViewController alloc]init]; 
     cview = viewControllerObj.view; 
    } 

    [UIView transitionFromView:[currentView view] toView:cview duration:2 options:UIViewAnimationOptionTransitionCurlUp completion:^(BOOL finished) {}]; 

    [currentView release]; 

    cview = nil; 
} 

@end 

其目的是执行视图转变,所以我不必再Ñ再次

第一,我创​​建方法编写代码这个类非静态的变量...

我检查设备我是也许越来越泄漏,因为我是ALLOC INITING并没有释放OBJ文件if语句

如果我释放在过去的我无法执行视图转变的OBJ因为我想去被破坏

下一个视图................... ...................

检查我转换这个类的方法和变量,以静态的,所以我可以检查保留计数

为什么我转换成原因静态...如果每次创建这个类的新实例,我总会得到当前实例的保留计数1

现在我第一次执行这个工作正常,但如果你看看aboutGame,如果阻止第一个e xecution下次打印0如果我想再次在这个页面上NSLog行成为僵尸?

......................................

在最后一行[currentView发布]是去除根视图控制器......但我没有Init这ALLOC我不这样,为什么我应该释放它的主人..我在一本书中释放视图控制器看到代码。

......................................

哪个是最好的方式来实现这种情况静态或者非静态

我使用这个类的方法和变量静态和其优良的工作没有泄漏没有僵尸没有问题?????

回答

1

一些观察:

  • 类名应以大写字母

  • retainCount是没用的开始。别叫它。

  • ,如果你重新分配一个实例变量(或全球),你应该释放分配前的旧值(这可能是你的内存泄漏的来源)。

  • 你是对的;你不应该在该方法中释放currentView

这是落实这种情况静态或 非静态

这个问题并没有真正意义的最佳途径;它掩盖了视图控制器和内存管理在iOS上的工作方式的误解。

如果可以,我建议您将项目转换为使用ARC(自动引用计数)。这主要是为你处理内存管理(主要是 - 你仍然需要考虑,而不是机械地)。

接下来,您将需要回到与UIView和UIViewController相关的“编程...”指南。

+0

'retainCount是无用的。别叫它。'应该是巨大的粗体字:) – deanWombourne 2011-12-19 17:32:04

+0

呃......我现在就结束了。最后把它们全部放在我的博客上。 http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/ – bbum 2011-12-19 17:40:42

+0

感谢您的详细解答..它帮助了很多。 – supera 2011-12-20 05:02:50

0

我觉得你并不需要你在这个功能做到这一点

实际就是

[UIView的transitionFromView:[currentView观点】toView:CView的时间:2种选择:UIViewAnimationOptionTransitionCurlUp完成:^ (BOOL finished){}];

,这是你想要的

+0

好吧,你是对的,但我想知道内存行为..所以我可以更详细地了解这个内存的东西..如此复杂的情况可以很容易地处理 – supera 2011-12-19 10:16:14