Iphone 不安全的未恢复属性有什么用途?

Iphone 不安全的未恢复属性有什么用途?,iphone,ios,Iphone,Ios,我知道不安全的定义 所以我不希望有人写下它的定义 我想通过示例了解它的用法,以及它如何与内存管理配合使用。在ARC之前,可以将委托或对父属性的其他引用指定为分配,以防止保留循环。随着ARC和更新编译器的引入,您将改用不安全的\u未维护的 因此,您可以在不需要引用所有权的任何时候,以及不需要或不想使用新的弱引用类型时使用它(当引用被解除分配时,它会使引用无效)。不安全\u未恢复的仅存在于ARC()中。它的工作原理类似于MRC(手动参考计数)中的assign。这些属性将不会被保留。通常,您希望为代理

我知道不安全的定义

所以我不希望有人写下它的定义


我想通过示例了解它的用法,以及它如何与内存管理

配合使用。在ARC之前,可以将委托或对父属性的其他引用指定为
分配
,以防止保留循环。随着ARC和更新编译器的引入,您将改用
不安全的\u未维护的


因此,您可以在不需要引用所有权的任何时候,以及不需要或不想使用新的
引用类型时使用它(当引用被解除分配时,它会使引用无效)。

不安全\u未恢复的
仅存在于ARC()中。它的工作原理类似于MRC(手动参考计数)中的
assign
。这些属性将不会被保留。通常,您希望为代理使用此类属性,因为它们不需要保留它们的所有者

属性类似于
不安全_unretained
,只是它们工作起来更智能一些。释放分配给属性的对象时,弱引用将自动变为
nil
,以避免在向该对象(其内存地址)发送消息时崩溃


不安全\u未恢复
属性不会执行此操作。它们将始终保留分配给它的内存地址(除非您手动更改),而不管与该地址关联的对象是什么。在这种情况下,弱引用可以防止崩溃,但结果仍然不会如预期的那样。如果你的代码是有组织的并且写得很好,这就不应该发生


那么,您为什么要使用
不安全的\u未恢复的
而不是
弱的
?弱引用仅在iOS 5及更高版本上可用,因此,如果您正在构建针对iOS 4的ARC应用程序,则需要使用
safe\u unretained
属性。再说一次,将消息发送到已发布的属性并不是您希望在任何代码中都包含的内容。如果您的代码组织得很好,那么您应该不会有任何问题。

这里是不安全的未维护的特定用例。假设两个类相互引用,一个方向是强的,另一个方向是弱的。在第一个类的dealloc期间,第二个类对它的弱引用将已经为零,从而阻止进行适当的清理。将弱引用替换为不安全的未恢复引用将解决此问题。请参见下面的代码示例:

@class Foo;

@interface Bar: NSObject

//Replacing weak with unsafe_unretained prevents this property from becoming nil during Foo.dealloc
@property (nonatomic, weak) Foo *foo;

- (id)initWithFoo:(Foo *)foo;

@end

@interface Foo : NSObject

@property (nonatomic, strong) Bar *bar;

- (void)startObserving;
- (void)endObserving;

@end

@implementation Bar

- (id)initWithFoo:(Foo *)foo {
    if ((self = [super init])) {
        self.foo = foo;

        //Start observing
        [self.foo startObserving];
    }
    return self;
}

- (void)dealloc {
    //Since foo is a weak property, self.foo may actually be nil at this point! See dealloc of class Foo.
    [self.foo endObserving];
}

@end

@implementation Foo

- (id)init {
    if ((self = [super init])) {
        self.bar = [[Bar alloc] initWithFoo:self];
    }
    return self;
}

- (void)dealloc {
    //This will trigger the deallocation of bar. However, at this point all weak references to self will return nil already!
    self.bar = nil;

    //endObserving is never called, because Bar.foo reference was already nil.
}

- (void)startObserving {
    NSLog(@"Start observing");
}

- (void)endObserving {
    NSLog(@"End observing");
}

@end
你可以查一下