ios - 奇怪和陌生的内存行为

标签 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

它的目的是执行 View 转换,这样我就不必再次编写代码

首先我将此类的方法和变量创建为非静态...

我检查了设备,我发现泄漏可能是因为我在 if 语句中分配初始化而不是释放对象

如果我在最后释放对象,我将无法执行 View 转换,因为在下一个我想要进入的 View 上被破坏了

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

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

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

现在我第一次执行这个它工作正常,但是如果你看看 aboutGame if block 第一次执行打印 0 下次如果我想再次进入这个页面,NSLog 行就会变成僵尸???

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

最后一行[currentViewrelease]是删除 Root View Controller ...但我没有分配init这个我不是所有者所以为什么我应该释放它..我在一本书中看到了释放 View 的代码 Controller 。

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

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

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

最佳答案

一些观察:

  • 类名应以大写字母开头

  • retainCount 没有用。不要调用它。

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

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

which is the best way to implement this kind of situation static or non-static

这个问题确实没有意义;它掩盖了对 View Controller 和内存管理在 iOS 上如何工作的误解。

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

接下来,您将需要深入了解与 UIView 和 UIViewController 相关的“使用...编程”指南。

关于ios - 奇怪和陌生的内存行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8558654/

相关文章:

ios - UISearchController 未在 UITableViewController 中搜索

java - 如何诊断由 Java 程序引起的 C 内存泄漏?

ios - 如何使用自动引用计数(ARC)?

c - 字符串修剪导致内存泄漏?

ios - AsyncDisplayKit ASButtonNode 如何设置 buttonType

ios - 使用分段控件在 UITabBarController 中以模态方式呈现导航 View Controller

python - BLAST 数据库分配错误

c++ - memcpy 仅通过 C++ 复制一个字节

ios - 如何在 View Controller 被关闭后显示警报

c++ - 新的和重新分配的内存