2010-05-27 37 views
0

我很好奇,如果有一个很好的理由,我应该/不应该在下面的tabBarController中使用@synthesize,或者没有关系?@synthesize与UITabBarController?

@implementation ScramAppDelegate 
@synthesize window; 
@synthesize tabBarController; 

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    [self setTabBarController:[[UITabBarController alloc] init]]; 
    [window addSubview:[tabBarController view]]; 
    [window makeKeyAndVisible]; 
    return YES; 
} 

-(void)dealloc { 
    [tabBarController release]; 
    [self setTabBarController: nil]; 
    [window release]; 
    [super dealloc]; 
} 

OR

@implementation ScramAppDelegate 
@synthesize window; 

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    tabBarController = [[UITabBarController alloc] init]; 
    [window addSubview:[tabBarController view]]; 
    [window makeKeyAndVisible]; 
    return YES; 
} 

-(void)dealloc { 
    [tabBarController release]; 
    [window release]; 
    [super dealloc]; 
} 

欢呼加里

回答

1

我个人不打扰@property我的视图控制器在我的应用程序委托类。主要是因为应用程序委托位于视图层次结构的顶部,并且它不需要将其成员变量公开给任何人。

另一个原因不是来自行:

tabBarController = [[UITabBarController alloc] init]; 

因为如果tabBarController@property设置为retain,你会双保留对象,它是内存泄漏的一种形式(虽然相对温和因为它发生在应用程序委托级别)。

+0

我一直在想内存泄漏,这就是为什么我做了[tabBarController release];和[self setTabBarController:nil];在dealloc中。通过我的思维方式,导致正确的内存管理,虽然它稍微有些学术性,但dealloc从不会被调用,因为应用程序在退出时可以释放所有内存。 – fuzzygoat 2010-05-30 19:25:12

+0

问题在于你已经保留了两次('alloc'递增了保留计数,然后你的属性被设置为'retain',所以生成的setter会再次增加这个计数),所以如果你'重新释放一次,然后将其设置为零,您将创建一个内存泄漏。 – 2010-05-30 19:43:55

+0

所以保留计数是2,在释放它的1之后,设置nil之后它再次释放(现在它的0)并且保留nil? – fuzzygoat 2010-05-30 19:55:43

-1

如果tabBarController是一个属性(与@property (nonatomic, retain) TabBarController *tabBarController您的.h文件中声明),并且要为它自动创建getter和setter方法,你应该在你的.m文件中使用@synthesize。如果你想自己实现getter和setter,你必须指定@dynamic tabBarController

+0

如果您没有使用@synthesize _而且您没有立即实现您自己的getter和setter,则只需要使用@dynamic指令,例如,如果Core Data将为您创建建模属性。如果.m文件包含具有适当名称和类型的getter和setter,则不需要使用@synthesize或@dynamic。 – 2010-08-05 04:04:20