界面
@property (nonatomic, retain) PracticalSignsMainViewController *practicalVC;
实施
if (self.practicalVC == nil) {
PracticalSignsMainViewController *vc = [[PracticalSignsMainViewController alloc] init];
self.practicalVC = vc;
[vc release];
}
我只想在这种情况下创建一个viewcontroller对象并更改它所处理的数据。但是保留或分配此viewcontroller是正确的(为什么会这样)?它用于导航层次。
感谢。
答案 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语句中自动释放将更安全,以避免错过释放。