2013-04-09 26 views
0

我的根視圖控制器的發佈方法被調用了38次,但我沒有調用release,爲什麼會發生?Objective-c發佈多次調用

@implementation AppDelegate 

- (void)dealloc 
{ 
    [_window release]; 
    [_viewController release]; 
    [super dealloc]; 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
     self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil] autorelease]; 
    } else { 
     self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil] autorelease]; 
    } 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

@interface ViewController() 

@end 

@implementation ViewController 

-(oneway void)release 
{ 
    NSLog(@"release called"); 
    [super release]; 
} 

@end 

outpout

2013-04-09 19:47:36.060 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.063 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.064 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.065 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.065 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.066 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.067 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.068 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.072 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.073 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.074 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.075 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.077 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.080 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.081 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.081 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.082 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.108 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.110 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.111 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.112 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.134 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.144 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.158 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.161 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.170 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.180 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.182 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.193 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.197 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.198 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.199 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.202 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.208 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.208 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.218 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.220 TesteRelease[44985:c07] release called 
2013-04-09 19:47:36.220 TesteRelease[44985:c07] release called 

我不使用ARC。

+1

您的視圖控制器對象可以由幾個框架對象傳遞。此外,即使_you_不使用ARC,也許Apple會這樣做; ARC在調用保留/釋放時並不輕鬆。無論如何,我認爲這與日誌發佈呼叫無關。只有在調用dealloc時它纔會起作用。 – zneak 2013-04-09 22:58:33

回答

3

框架的一部分保留並釋放(或自動釋放)該對象,因爲他們覺得合適。這就是爲什麼我們鼓勵您不要試圖準確追蹤保留數量的衆多原因之一 - 您不需要知道所有這些保留和發佈的情況,因爲它們與您無關。

1

很可能,您的視圖控制器正在被添加到autorelease池,因爲它是通過系統庫傳遞的。但只要你確信你的代碼正確地管理了視圖控制器,你應該忽略它作爲背景噪聲。