【问题标题】:Why retain property may not retain on Objective-C?为什么保留属性可能不会保留在 Objective-C 上?
【发布时间】:2013-04-12 20:55:22
【问题描述】:

为什么下面的代码会崩溃?注释代码不会崩溃。

@property (retain) NSDate *lastCurrentDate;

...

@synthesize lastCurrentDate;

- (void)viewWillAppear:(BOOL)animated {
    BOOL crash = [lastCurrentDate isEqualToDate:[NSDate date]]);
}

- (void)viewDidDisappear:(BOOL)animated {
    //lastCurrentDate = [[NSDate date] retain];
    lastCurrentDate = [NSDate date];
}

那么,为什么在 Objective-C 上可能无法保留属性?

【问题讨论】:

  • 可以报崩溃错误吗?
  • 我刚刚尝试了同样的事情,但它没有崩溃。此处显示的代码中是否缺少任何内容。如果您有任何遗漏,我将不胜感激。否则,您可以使用崩溃错误进行更新。
  • 我想它崩溃是因为当您发送消息 isEqualToDate 时变量为空,因为它尚未初始化;在方法viewDidDisappear中初始化一个变量是错误的
  • Harry,它不会因为奇怪的苹果政策而崩溃:应用程序应该在开发人员的设备上运行,并且应该在用户的设备上崩溃。但前提是您不使用NSZombie = YES 设置。

标签: iphone ios objective-c properties retain


【解决方案1】:

因为你直接赋值给了实例变量,而不是使用 属性访问器方法:

self.lastCurrentDate = [NSDate date];

【讨论】:

  • 为什么实例变量的名称是“lastCurrentDate”而不是“_lastCurrentDate”?
  • @Altaveron:因为您的代码中有@synthesize lastCurrentDate;,请查看其他答案。
【解决方案2】:

当您编写@synthesize lastCurrentDate 时,您还会创建名为“lastCurrentState”的变量,而当您编写lastCurrentDate = [NSDate date]; 时,您可以直接访问该变量。属性应该通过点访问:self.lastCurrentDate = ....;

在最后的 xCodes 中,您不需要编写 synthesize - 它会自动完成,但会创建以 '_' 前缀命名的变量。等于:@synthesize variable = _variable;

【讨论】:

    【解决方案3】:

    使用self.lastCurrentDate = [NSDate date]。因为当您使用self.lastCurrentDate 时,它将通过setter 方法分配。你通过retain属性声明vaiable,所以你的setter方法会做两个操作,assignretain

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 2013-10-17
      • 2020-06-19
      • 1970-01-01
      • 2010-10-29
      • 2023-03-30
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      相关资源
      最近更新 更多