странное и чуждое поведение памяти - PullRequest
0 голосов
/ 19 декабря 2011

в моем проекте я создал класс 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 в последнем, я не могу выполнить переход вида, потому что при следующем просмотре, к которому я хочу перейти, уничтожено

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

чтобы проверить, что я преобразовал методы и переменные этого класса в статические, чтобы я мог проверить сохранение количества

причина, по которой я перешел в статический режим ... если каждый раз, когда создается новый экземпляр этого класса, я всегда получаю счет 1 текущего экземпляра

Теперь, когда я в первый раз выполняю это, все работает нормально, но если вы посмотрите на aboutGame, если block, то первое выполнение напечатает 0 в следующий раз, если я захочу снова перейти на эту страницу, строка NSLog становится зомби ???

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

в последней строке [выпуск currentView] должен удалить контроллер корневого представления ... но я не выделил init это, я не владелец, поэтому я должен выпустить его .. я видел код в книге, чтобы освободить представление контроллер.

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

, который является наилучшим способом реализации статической или нестатической ситуации такого рода

Я использую этот метод класса и переменную в качестве статического, и он работает нормально, без утечек, без зомби, без проблем ?????

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Некоторые наблюдения:

  • имена классов должны начинаться с заглавной буквы

  • retainCount бесполезно. Не называй это.

  • если вы переназначаете переменную экземпляра (или глобальную), вы должны освободить старое значение перед присваиванием (это может быть причиной утечки памяти).

  • вы правы; Вы не должны выпускать currentView в этом методе.

, который является лучшим способом реализовать такую ​​ситуацию статически или нестатическая

Этот вопрос на самом деле не имеет смысла; это противоречит неправильному пониманию того, как контроллеры представления и управление памятью работают на iOS.

Если вы можете, я бы порекомендовал вам преобразовать проект в ARC (автоматический подсчет ссылок). Это в основном позаботится об управлении памятью для вас (в основном - вы все еще должны думать об этом, просто не так механически).

Затем вы захотите вернуться к руководствам по «программированию с ...», связанным с UIView и UIViewController.

0 голосов
/ 19 декабря 2011

Я думаю, вам не нужно это делать

Фактическая вещь, которую вы делаете в этой функции:

[UIView transitionFromView: [текущий просмотр] toView: продолжительность просмотра: 2 варианта: UIViewAnimationOptionTransitionCurlUp завершение: ^ (BOOL закончено) {}];

и это то, что вы хотите

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...