有没有办法检查unowned(safe)Swift引用的"可用性"?所以,我正在寻找一个假设的函数isReferenceAccessible,如下例所示:
func someMethod() {
someAsyncOperation(parameters) { [unowned(safe) self] in
guard isReferenceAccessible(self) else {
return
}
self.someAnotherMethod()
}
}
Run Code Online (Sandbox Code Playgroud)
免责声明:这个问题与weak参考文献无关!我知道如何strong,unowned以及weak引用的工作.而且我不想使用weak引用(因为它可能很慢,而且可变).我知道unowned(safe)即使已经deinited在我们尝试访问它时,仍然会分配引用.我知道编译器可以执行此检查,并在应用程序崩溃之前实际检查它.
因此,我相信它可以是非常强大且执行良好的技术/范例,可以打破现代Swift中的参考周期.
而且,我相信它可以是一个很棒的语言功能!例如,让我们假设我们已经调用了修饰符shared_ownership,它的工作思路如上所述:
method(parameters) { [shared_ownership self] in
self.someAnotherMethod()
}
Run Code Online (Sandbox Code Playgroud)
......实现如下:
method(parameters) { [unowned(safe) self] in
guard isReferenceAccessible(self) else {
return
}
self.someAnotherMethod()
}
Run Code Online (Sandbox Code Playgroud)
......副作用(没有weak相关的复杂性和性能惩罚)相当于:
method(parameters) { [weak self] in
guard let strongSelf = self else {
return …Run Code Online (Sandbox Code Playgroud) 假设我想创建一个临时变量,例如:
指向另一个长寿变量:
__unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView;
Run Code Online (Sandbox Code Playgroud)指向我刚刚创建的对象.
__unsafe_unretained UIView *tableHeaderView = [[UIView alloc] init];
Run Code Online (Sandbox Code Playgroud)这些临时变量不需要保留,因为只要临时变量在范围内,它们指向的对象就可以保证保留正保留计数.那么,我应该声明它们__unsafe_unretained吗?
objective-c retaincount automatic-ref-counting unsafe-unretained
几个星期前我开始使用objective-c和iOS(值得记住),我提前为这个糟糕的图表道歉!

上图显示了我对Web服务的调用结构.细箭头表示创建另一个对象的对象,而粗箭头表示持有对指向对象的强(保留)引用的对象.
我相信这包含所谓的"循环引用",并且在解除分配对象时会产生问题.
我明白,简单的答案就是取代一些强弱的弱引用,我喜欢这样做,除了我的项目也针对iOS 3.2(不是我的决定 - 我不能真正改变这个事实!) .所以,我认为我说我必须使用__unsafe_unretained,但我非常担心这些不会自动归零,因为当对象被释放时我最终会遇到EXC_BAD_ACCESS问题. ..
所以我的问题首先是我有循环引用.要解决,我将不得不使用__unsafe_unretained,这导致我的第二个问题:如何正确管理这些?
可能与之相关的问题是:NSURLConnection如何管理它的强引用?我从各种渠道获悉,它保留了代表团吗?所以...如果我保留一个NSURLConnection,(也是它的代表)并保留我,这也是一个循环引用,不是吗?它是如何解决我的问题的?
任何建议都非常欢迎!
问候,尼克
我正在尝试将项目转换为ARC.该项目有一个Directed Acyclic Word Graph,它基本上意味着到处都有很多双重间接指针.
这对于转换为ARC来说是一个相当大的挑战,特别是一个问题让我目前难以接受.
这是场景.
假设你有一个NSString *:
NSString *b = [[NSString alloc] initWithString:@"hello"];
Run Code Online (Sandbox Code Playgroud)
您还有一个双间接类型:
__unsafe_unretained NSString **a;
Run Code Online (Sandbox Code Playgroud)
您想要将一个分配给另一个,如下所示:
a = &b;
Run Code Online (Sandbox Code Playgroud)
这会产生转换错误:
error: assigning 'NSString *__strong *' to 'NSString *__unsafe_unretained *' changes retain/release properties of pointer
Run Code Online (Sandbox Code Playgroud)
更改b到__unsafe_unretained不工作.我也尝试了各种桥接演员.我错过了一些明显的东西吗?
有任何想法吗?
谢谢!
pointers objective-c automatic-ref-counting unsafe-unretained
takeUnretainedValue和之间有什么区别takeRetainedValue?根据Apple的文档:
这两种方法都返回原始的,未包装的对象类型.您可以根据要调用的API是否返回未保留或保留的对象来选择要使用的方法.
但是,我如何知道非托管对象是未保留对象还是保留对象?例如,该方法ABAddressBookCreateWithOptions:从AddressBook框架返回一个非托管对象ABAddressBook,其中一些教程认为这是一个保留的对象.使用时ALAsset,该方法thumbnail返回一个非托管对象CGImage,一些教程认为这是一个未保留的对象.
我将感激你的帮助.
memory-management retained-in-memory unsafe-unretained swift