# 31、在dealloc方法中只释放引用并解除监听

```objectivec
- (void)dealloc {
  CFRelease(coreFoundationObject);
  [[NSNotificationCenter defaultCenter] removeObserver:self]; 
}
```

```objectivec
// 为稀有资源添加：创建 和 释放 方法
- (void)open:(NSString *)address;
- (void)close;
```

```objectivec
// iOS应用程序终止时调用 UIApplicationDeleagte 的方法：（如：crash时）
- (void)applicationWillTerminate:(UIApplication *)application;
```

​ `dealloc`方法：

1. 不要随便调用其他方法，在这里无论调用什么方法都不太应该，因为对象此时“已近尾声”（in a winding-down state)。若所调用的方法又要异步执行任务或又要继续调用他们自己的某些方法，等到那些任务执行完毕时还行通知当前对象，而系统已经把当前待回收的对象彻底摧毁了。这会导致很多问题，经常crash。
2. `dealloc`方法所在的线程会执行“最终的释放操作”（final release），令对象的保留计数降为0，而某些方法必须在特定的线程里（如：主线程）调用才行。（若在dealloc里调用了哪些方法，则无法保证当前这个线程就是那些方法所需的线程）
3. 不要调用属性的存取方法，因为有人可能会覆写这些方法，并于其中做一些无法在回收阶段安全执行的操作。另外属性可能正出去“键值观测”（KVO）机制的监控之下，该属性的观察者（observer）可能会在属性值改变时“保留”或使用这个即将回收的对象

要点：

* 在`dealloc`方法里，只应释放指向其他对象的引用，并取消原来订阅的“键值观察”（KVO）或`NSNotificationCenter`等通知，不要做其他事情
* 若对象持有文件描述符等系统资源，那么应专门写方法释放此资源。这样的类要和其使用者约定：用完资源后必须调用`close`方法
* 执行异步任务的方法不应在`dealloc`里调用；只能在正常状态下执行的那些方法也不应在dealloc里调用，因为此时对象已处于正在回收的状态了
