2011-10-02 103 views
0

我看到属性和合成使用没有“声明变量”第一..我对使用什么属性有点困惑。我想要在AppDelegate中分配并初始化我的viewController,然后确保它在剩余的运行中。显然,我想保留财产?.. 然而..因为alloc返回保留计数1的viewController,它接缝很多聪明只是使用留下retain-property。没有其他班会使用我的二传手,所以我不在乎呢?Xcode混淆 - 属性和综合,保留?

Ex。

在AppDelegate.h

@propert(nonatomic,retain) MyViewController *myViewController; 

在AppDelegate.m

@synthesize myViewController = _myViewController; 
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
     self.myViewController = [[[EventDataController alloc] init] autorelease]; 
     [self.window makeKeyAndVisible]; 
     return YES; 
    } 

或..

在AppDelegate.h

@propert(nonatomic) MyViewController *myViewController; 

在AppDelegate.m:

@synthesize myViewController = _myViewController; 
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
     self.myViewController = [[EventDataController alloc] init]; 
     [self.window makeKeyAndVisible]; 
     return YES; 
    } 

设置我直,请。

回答

1

我会去第一个选项。

为什么当你完成它时你不能明确地发布myViewController

我不会做出像“这个类永远不会被其他人使用”的假设。

+0

把任何东西放在appDelegate dealloc方法中没有任何意义。在那个时候,没有必要,苹果甚至可能不会打扰调用appDelegate dealloc方法,这将完全浪费时间。 – zaph

+0

您能否提供支持这一假设的参考? – tobiasbayer

+0

想通了。答案已调整。 – tobiasbayer

3

你不需要为属性定义实例变量了 - @synthesize为你做了。

至于你的其他问题 - 你可以这样做,但不要忘记在你的-dealloc中发布它。我喜欢(nonatomic, retain),因为它非常清晰,易于使用/理解。你要做的就是分配和它所有的休息:

self.myViewController = [[[ViewController alloc] init] autorelease]; 

在你-dealloc

self.myViewController = nil; 

在手动释放你可能想忘记的所有属性,并且只使用实例变量的情况下像这样:

@interface MyClass: NSObject 
{ 
    ViewController* _myViewController; 
} 
@end 

在您的实现:

_myViewController = [[ViewController alloc] init]; 

在你-dealloc

[_myViewController release]; 
_myViewController = nil; 

注意的nil最后分配可能是不必要的,但我已经对这个有太多难以跟踪的错误(这就是为什么我喜欢保留特性 - 所有你需要做的是将它们设置为零)。

我试着总是去保留属性,因为这节省了我一些脑循环,我不关心我可以为CPU保存的纳秒。

0

的选项,我宁愿声明与retain属性。这是为了您的文档,并且它可以帮助您避免因静态分析等工具而导致的愚蠢错误。因为你的类拥有控制器,所以应该声明它拥有对它的引用,而不管实现细节如何。与传统习语的偏离是引入错误的好方法。你也应该声明它为readonly