标签: unsafe-unretained

有没有办法检查"无主"(实际上是"无主(安全)")参考已被删除?

有没有办法检查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)

memory-management weak-references unsafe-unretained swift

6
推荐指数
1
解决办法
889
查看次数

我应该将__unsafe_unretained用于临时变量吗?

假设我想创建一个临时变量,例如:

  1. 指向另一个长寿变量:

    __unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 指向我刚刚创建的对象.

    __unsafe_unretained UIView *tableHeaderView = [[UIView alloc] init];
    
    Run Code Online (Sandbox Code Playgroud)

这些临时变量不需要保留,因为只要临时变量在范围内,它们指向的对象就可以保证保留正保留计数.那么,我应该声明它们__unsafe_unretained吗?

objective-c retaincount automatic-ref-counting unsafe-unretained

3
推荐指数
1
解决办法
652
查看次数

如何管理unsafe_unretained ivars/properties?

几个星期前我开始使用objective-c和iOS(值得记住),我提前为这个糟糕的图表道歉!

在此输入图像描述

上图显示了我对Web服务的调用结构.细箭头表示创建另一个对象的对象,而粗箭头表示持有对指向对象的强(保留)引用的对象.

我相信这包含所谓的"循环引用",并且在解除分配对象时会产生问题.

我明白,简单的答案就是取代一些强弱的弱引用,我喜欢这样做,除了我的项目也针对iOS 3.2(不是我的决定 - 我不能真正改变这个事实!) .所以,我认为我说我必须使用__unsafe_unretained,但我非常担心这些不会自动归零,因为当对象被释放时我最终会遇到EXC_BAD_ACCESS问题. ..

所以我的问题首先是我有循环引用.要解决,我将不得不使用__unsafe_unretained,这导致我的第二个问题:如何正确管理这些?

可能与之相关的问题是:NSURLConnection如何管理它的强引用?我从各种渠道获悉,它保留了代表团吗?所以...如果我保留一个NSURLConnection,(也是它的代表)并保留我,这也是一个循环引用,不是吗?它是如何解决我的问题的?

任何建议都非常欢迎!

问候,尼克

objective-c ios automatic-ref-counting unsafe-unretained

3
推荐指数
1
解决办法
2990
查看次数

使用双间接指针分配将项目转换为ARC

我正在尝试将项目转换为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

3
推荐指数
1
解决办法
1779
查看次数

takeUnretainedValue和takeRetainedValue有什么区别?

takeUnretainedValue和之间有什么区别takeRetainedValue?根据Apple的文档:

这两种方法都返回原始的,未包装的对象类型.您可以根据要调用的API是否返回未保留或保留的对象来选择要使用的方法.

但是,我如何知道非托管对象是未保留对象还是保留对象?例如,该方法ABAddressBookCreateWithOptions:AddressBook框架返回一个非托管对象ABAddressBook,其中一些教程认为这是一个保留的对象.使用时ALAsset,该方法thumbnail返回一个非托管对象CGImage,一些教程认为这是一个未保留的对象.

我将感激你的帮助.

memory-management retained-in-memory unsafe-unretained swift

3
推荐指数
1
解决办法
1846
查看次数