奇怪和外星人的记忆行为

时间:2011-12-19 08:17:13

标签: ios memory memory-leaks memory-management

在我的项目中我创建了一个类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

其目的是执行视图转换,因此我不必再次再次编写代码

首先我创建了这个类的方法和变量作为非静态...

我在设备上检查了我的泄漏可能是因为我是分配启动而不是在if语句中释放objs

如果我在最后发布objs我无法执行视图转换,因为在我要去的下一个视图中被销毁

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

检查我将此类方法和变量转换为静态,以便我可以检查保留计数

我转换为静态的原因...如果每次创建此类的新实例,我将始终获得当前实例的保留计数

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

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

在最后一行[currentView发布]是删除根视图控制器...但我没有分配init这我不是所有者所以为什么我应该释放它..我看到一本书中的代码发布视图控制器。

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

这是实现静态或非静态

这种情况的最佳方式

我使用这个类方法和变量作为静态和它的工作正常没有泄漏没有僵尸没有问题?????

2 个答案:

答案 0 :(得分:1)

一些观察结果:

  • 班级名称应以大写字母

  • 开头
  • retainCount没用。不要打电话。

  • 如果要重新分配实例变量(或全局),则应在分配之前释放旧值(这可能是内存泄漏的来源)。

  • 你是对的;你不应该在该方法中发布currentView

  

这是实现静态或这种情况的最佳方式   非静态

这个问题确实没有意义;它掩盖了对视图控制器和内存管理如何在iOS上运行的误解。

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

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

答案 1 :(得分:0)

我认为你不需要这样做

你在这个函数中做的实际事情是

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

这就是你想要的