【问题标题】:Should I retain or assign the viewcontroller in this case?在这种情况下我应该保留还是分配视图控制器?
【发布时间】:2011-02-07 17:43:29
【问题描述】:

界面

@property (nonatomic, retain) PracticalSignsMainViewController *practicalVC;

实施

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

我只想在这种情况下创建一个视图控制器对象并更改它所作用的数据。但是,保留或分配此视图控制器是否正确(为什么会这样)?它用于导航层次结构。

谢谢。

【问题讨论】:

    标签: iphone


    【解决方案1】:

    保留。通常,您希望对象属性为retained,而原始属性为assigned。这里的答案真的很好:Use of properties for primitive types

    【讨论】:

    • 我还要补充一点,具有可变/不可变对应物(例如 NSString、NSArray 等)的类集群是 copyed。
    • 同意。我忘了提到副本。
    • 等一下...他的二传手正在保留它,为什么他需要再次保留它?
    • 这是个问题,他的二传手应该保留还是分配。他的代码是正确的。
    【解决方案2】:

    如果您打算缓存导航中使用的视图控制器,则需要保留它。原因是导航控制器暂时保留它,一旦用户点击后退按钮,导航控制器将向视图控制器发送release 消息。如果您当时没有在其他任何地方保留视图控制器,它将被释放。

    如果您每次都创建一个新实例,那很好,但如果属性使用assign 语义,显然会破坏缓存的实例。

    【讨论】:

      【解决方案3】:

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

      如果你做了以下合成,

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

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

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

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

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

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

      所以如果我们想显式地立即减少retaincount,我们应该使用成对的“release”。

      -(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
      

      ...

      如您所见,(我自然地再次测试了上面的代码)return 语句和 alloc 语句中的“autorelease”几乎相同。如果你想更难地管理保留计数,我们应该使用“释放”。 我认为 alloc 语句中的“autorelease”比 return 语句中的要好,因为 return 中的“autorelease”可以省略。 :)

      2。编码风格, 作为“1.autorelease”的结尾,我认为alloc语句中的autorelease会更安全,以避免丢失释放。

      【讨论】:

      • 您的代码与 OP 的代码相同,但它使用自动释放,除非返回新分配的对象,否则许多人会避免这种情况。
      • 除了关于自动释放的错误建议;将所有代码写在一行中不会使代码更有效率,并且可能会使其更难阅读。编写代码以提高可读性,并让编译器优化代码以提高效率。
      • @Abizern 它有什么不妥之处?也许它不完整(当然还有很多其他原因使用自动释放),但我相信我基本上是正确的。许多程序员使用自动释放作为一种逃避,或者作为错误理解 Obj-C 内存管理的结果。
      • @6NSString - 该评论是针对单独的,而不是针对您的。 autorelease 有它的用途,但这不是其中之一。
      • @6NSString @Abizern 好的,你是对的(或部分正确)。并感谢您的 cmets。请稍后查看我修改后的答案。
      猜你喜欢
      • 2017-03-05
      • 2019-01-20
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      相关资源
      最近更新 更多