2011-12-19 52 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