【问题标题】:strong / weak / retain / unsafe_unretained / assign强 / 弱 / 保留 / unsafe_unretained / 分配
【发布时间】:2012-04-04 19:11:34
【问题描述】:

用于综合属性的属性: 保留/分配

  • retain - 它被保留,旧值被释放并被分配
  • assign - 仅被分配

所有权属性: IOS5 = 强/弱 IOS4 = 保留 / unsafe_unretained

  • strong (iOS4 = 保留) - 我是所有者,你不能解除分配这个 在目标良好之前 = 保留

  • weak (iOS4 = unsafe_unretained) - 与分配相同,没有保留 或释放

所以 unsafe_unretained == 分配?

@property (nonatomic, assign) NSArray * tmp;

等于?

@property (nonatomic, unsafe_unretained) NSArray * tmp;

反之亦然?

如果是这样,在 iOS4 中更喜欢哪一个,或者如果它与 assign 完全相同,为什么会有 (unsafe_unretained)?

iOS4 中的委托应该是 unsafe_unretained 还是 assign?

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    如果是这样,在 iOS4 中更喜欢哪一个,或者如果 (unsafe_unretained) 与 assign 完全相同,为什么会有 (unsafe_unretained)?

    您应该使用unsafe_unretained。您想向您的代码读者展示您实际上想使用weak,但这是不可能的,因为weak 在您要部署的iOS 版本上不可用。

    有一天你会放弃对 iOS4 的支持。然后您可以搜索unsafe_unretained 并将它们全部替换为weak。这比搜索assign 并确定您的意思是assign 还是weak 容易得多

    使用unsafe_unretained 可以创建更易读和易于理解的代码,从而更容易看出开发人员的意图。 基本上与我们使用YES 而不是1 的原因相同。

    【讨论】:

    • 所以在 iOS4 中分配 == unsafe_unretained,但在 iOS5 中分配 != 弱,因此 unsafe_unretained 弱应该在哪里?对
    • 并且委托应该是 unsafe_unretained 或分配?
    • 一个委托应该有一个弱分配。但是由于weak 在iOS4 上不可用,你应该使用unsafe_unretained。我看不出有理由将assign 用于任何非原始类型(NSInteger、float、...)。在手动内存管理中,我们使用了assign,因为没有比这更好的了。但是weak要好得多,因为它在对象被释放时将变量设置为nil。
    • 在某些情况下 unsafe_unretained 是期望的行为。不过,不经常。弱引用在对象的 dealloc 之前被取消,因此在 dealloc 中对委托的事件可能需要不安全的委托。
    • @MatthiasBauch weak 而不是 unsafe_unretained 代表正是我所需要的!一些遗留的遗留代码仍然使用unsafe_unretained,并在执行委托方法时导致Thread 1: EXC_BAD_ACCESS (code=1, address=0x...) 错误。委托已经被解除分配但没有被取消,所以它实际上通过了我的 nil 检查并开始违背我的意愿执行选择器:(
    【解决方案2】:

    Cocoa 和 Cocoa Touch 中有一些类还不支持弱引用,这意味着您不能声明弱属性或弱局部变量来跟踪它们。这些类包括 NSTextView、NSFont 和 NSColorSpace;如需完整列表,请参阅过渡到 ARC 发行说明。

    如果您需要对这些类之一使用弱引用,则必须使用不安全引用。对于属性,这意味着使用 unsafe_unretained 属性:

     @property (unsafe_unretained) NSObject *unsafeProperty;
    

    对于变量,需要使用__unsafe_unretained:

    NSObject * __unsafe_unretained unsafeReference;
    

    不安全引用类似于弱引用,因为它不会保持其相关对象处于活动状态,但如果目标对象被释放,则不会将其设置为 nil。这意味着您将留下一个悬空指针,该指针指向最初由现在被释放的对象占用的内存,因此术语“不安全”。向悬空指针发送消息会导致崩溃。

    礼貌:Apple (https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html)。

    【讨论】:

      猜你喜欢
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      相关资源
      最近更新 更多