在这种情况下我应该保留或分配viewcontroller吗?

时间:2011-02-07 17:43:30

标签: iphone

界面

@property (nonatomic, retain) PracticalSignsMainViewController *practicalVC;

实施

if (self.practicalVC == nil) {
    PracticalSignsMainViewController *vc = [[PracticalSignsMainViewController alloc] init];
    self.practicalVC = vc;
    [vc release];
}

我只想在这种情况下创建一个viewcontroller对象并更改它所处理的数据。但是保留或分配此viewcontroller是正确的(为什么会这样)?它用于导航层次。

感谢。

3 个答案:

答案 0 :(得分:1)

保留。通常,您希望对象属性为retain,原始属性为assign。这里的答案非常好:Use of properties for primitive types

答案 1 :(得分:1)

如果您计划缓存导航中使用的视图控制器,则需要保留它。原因是当导航控制器暂时保留它时,一旦用户点击后退按钮,导航控制器将向视图控制器发送release消息。如果您尚未在其他任何地方保留视图控制器,则将取消分配。

如果你每次都在创建一个新实例,那就没问题,但是如果属性使用assign语义,那么显然会破坏缓存的实例。

答案 2 :(得分:0)

首先,您的代码是正确的,但它可以更简单。

如果您进行了以下合成,

@synthesize practicalVC; // synthesize release the existing reference if has

以下代码与您的代码相同。

self.practicalVC = [[[PracticalSignsMainViewController alloc] init] autorelease];

正如您所提到的,如果您的应用不需要多次访问视图控制器,则无需单独拥有视图控制器的实例。

==============修改==================== 在看到@ 6NSString @Abizern的答案后,我修改了我的答案。 关于自动释放和编码风格。

<强> 1。自动释放, @ 6NSString说“它使用自动释放,除非返回一个新分配的对象,否则许多人都会避免。” 但即使在return语句中使用“autorelease”,返回对象的保留计数也不会立即减少。它会在适当的时候减少。

因此,如果我们想要立即明确减少零售额,我们应该使用配对的“发布”。

-(NSObject*)testAuto {  
    return  [[[NSObject alloc] init] autorelease];
}
...
self.anObj = [self testAuto]; 
// the retainCount of anObj is 2

...

-(void)testAuto {
    self.anObj = [[[NSObject alloc] init] autorelease];
}
...
[self testAuto];
// the retainCount of anObj is also 2

...

-(void)testAuto {   
    self.anObj = [[[NSObject alloc] init] autorelease];
    [self.anObj release]; // Yes, yes, you may say this code does not look good. :)
}
...
[self testAuto]
// the retainCount of anObj is 1

...

如你所见,(我自然在上面再次测试代码)“autorelease”在return语句和alloc语句中几乎是相同的。如果你想更难管理保留计数,我们应该使用“发布”。 我认为alloc语句中的“autorelease”优于return语句中的“autorelease”,因为返回的“autorelease”可以省略。 :)

<强> 2。编码风格 作为“1. autorelease”的结束,我认为,在alloc语句中自动释放将更安全,以避免错过释放。