Kealdish's Studio.

Kealdish's Studio.

just focus

Weak 属性在 dealloc() 背后的逻辑

前言

我们都知道在 ARC 环境无论是强指针还是弱指针都无需在 dealloc 设置为 nil , ARC 会自动帮我们处理。然而,最近在项目中遇到这样一个问题,代码示例如下:

1
2
3
4
5
6
// class Foo
- (void)dealloc {
if (_obj) {
[_obj removeObserver:[KVOObserverStub stub] forKeyPath:_keyPath];
}
}

其中,_obj 是类 Foo 的 weak 属性,这段代码所做的工作是在 Foo 的实例对象销毁的时候,移除 _obj 对象上的观察者,否则,会导致 KVO still registering when deallocated 的 crash 。原以为这样写会 work ,然而在实际测试中发现,在触发 dealloc 方法时,_obj 此时已被置为 nil ,即 [_obj removeObserver:[KVOObserverStub stub] forKeyPath:_keyPath]; 并不会触发。解决方案则是将 _obj 属性的修饰符由 weak 改为 unsafe_unretained 或者 assign 。但是,这样改可能会为其他代码引入 bug ,因为现在 ARC 不会自动为将 _obj 对象置为 nil ,需要去检查涉及 _obj 部分的代码。虽然这样解决问题了,但是,我还是对 weak 属性在其持有对象的 dealloc 方法触发时背后的逻辑很感兴趣。

CFNetwork学习笔记(四)

前言

本篇文章主要讲述用CFHTTPAuthentication API如何与HTTP认证服务器交互,如何找到合适的认证对象和证书并填入到HTTP请求中。一般而言,如果HTTP服务器给你的HTTP请求返回401或407,就意味着服务器是认证服务器并且要求证书。在CFHTTPAuthentication API中,每个证书集合都被存储在CFHTTPAuthentication对象中。因此,每个不同的认证服务器和连接到服务器的不同用户都需要存储在独立的CFHTTPAuthentication对象中。为了能与服务器进行通信,你需要将CFHTTPAuthentication存储到HTTP请求当中。后面会对这些步骤进行详细解释。

CFNetwork学习笔记(二)

前言

本篇文章主要讨论如何创建、开启读写流并检查读写流上的错误。此外,还会介绍如何从读流中读出数据,如何向写流中写入数据,如何在读写的过程中防止发生阻塞,如何通过代理服务器来引导流。

CFStream可以用来读写文件或者与socket一起工作。除了创建流的过程之外,它们其他的行为都很相似。

CFNetwork学习笔记(一)

简介

提到CFNetwork框架,首先想到的是当年号称“网络终结者”的ASIHTTPRequest。ASI的底层就是基于CFNetwork开发的,现如今用的最广泛的AFNetworking框架则是基于NSURLSession开发的,相比而言,CFNetwork比NSURLSession更底层,在性能方面理论上来说CFNetwork会更好。之前没怎么研究过CFNetwork,所以决定深入研究一下。

avatar
Kealdish
Hear my roar.
FRIENDS