Xcode混淆 - 属性和综合,保留?

时间:2011-10-02 07:48:08

标签: iphone xcode properties retain init

我看到属性并合成使用而没有首先“声明变量”...我对使用什么属性感到有点困惑。我想在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;
    }

请我直截了当。

3 个答案:

答案 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