我看到属性并合成使用而没有首先“声明变量”...我对使用什么属性感到有点困惑。我想在AppDelegate中分配并初始化我的viewController,然后确保它在剩下的运行中存在。显然我想要保留财产?.. 但是..因为alloc返回带有保留计数1的viewController,它会更聪明地使用,只需使用retain-property。没有其他班级会使用我的二传手,所以我不在乎呢?
实施例
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;
}
请我直截了当。
答案 0 :(得分: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保存的纳秒。
答案 1 :(得分:1)
我会选择第一个选项。
为什么不能在完成后明确释放myViewController
?
我不会做出类似“这个类永远不会被其他人使用”的假设。
答案 2 :(得分:0)
的选项,我更喜欢用retain
声明属性。这是为了您的文档,它可以避免由于静态分析等工具而导致的愚蠢错误。由于您的类拥有控制器,因此无论实现细节如何,都应声明它拥有对它的引用。偏离传统习语是引入错误的好方法。您还应将其声明为readonly
。