假设我们对A ViewController(暂时叫AVC)进行的一个属性P进行KVO.那么在AVCdealloc的时候,removeKVO,是没有问题的.
但是,如果我们对AVC中的一个组件B的属性进行KVO,在 AVC dealloc的时候去remove KVO,就有一定概率crash,crash信息就是KVO没有被移除,对象B却已经释放了.
在MRC的时候,我们可以这样写AVC的dealloc:
- (void)dealloc
{
//remove KVO here
//release B here
[super dealloc];
}
我们手动管理B的释放,因此我们可以保证KVO的remove在B的release之前.这样完全不会有任何隐患.
但是ARC以后,我们不能手动控制B的release了,AVC的代码如下:
- (void)dealloc
{
//remove KVO here
}
我们能做的事只有remove KVO.但是AVC的B组件的dealloc时机是不确定,有可能在执行到remove之前,B已经释放了.就会造成crash.
解决办法1:重写B组件的dealloc方法,保证KVO的移除在B的释放之前.
解决办法2:在AVC的appear和disappear方法里,加上KVO的监听和移除逻辑.
分享到:
相关推荐
### 注意事项 - KVO只适用于遵循`NSKeyValueObservingProtocol`的对象,大多数Foundation和AppKit框架的对象都支持。 - 对于私有属性,KVO可能会导致代码可读性和可维护性降低,因此使用时需谨慎。 - 不推荐对`ivar...
以下是一些关于Objective-C的实用知识点和注意事项,它们可以帮助你提升开发效率和代码质量。 1. **消息传递机制**:Objective-C的核心是消息传递,它通过“发送消息”给对象来执行操作。了解`-[receiver message]`...
### 注意事项 尽管DGKVOBlocks简化了KVO,但依然需要注意以下几点: - **避免循环引用**:Block会捕获其作用域内的对象,可能导致循环引用。确保正确管理Block的生命周期,必要时使用`weakSelf`或`weakRef`来避免...
- **注意事项**:使用GCD时需要注意不要创建过多的线程,避免消耗过多系统资源。使用block时需要注意避免循环引用问题。 - **Block与GCD的关系**:Block可以作为GCD函数的参数,用于指定任务执行后的回调操作。 - **...
6. **Block注意事项**: - 使用`__block`修饰变量可以在Block内部修改其值,但可能导致循环引用,需要使用`__weak`来避免。 7. **单例模式**: - 单例是一种设计模式,确保类只有一个实例,并提供全局访问点。在...
4. **注意事项**:如果方法有特殊行为或限制,应在注释中明确指出。 5. **示例**:提供使用方法的示例代码,帮助理解方法的用法。 综上所述,iOS代码规范和方法注释对于开发高质量的iOS应用至关重要。它们不仅提高...
书中将详细介绍类别使用时的注意事项和潜在问题,以及如何通过类别增强既有类的功能。 4. **块(Blocks)**:Objective-C的块是一种闭包,可以在代码中捕获局部变量。书中会讲解如何创建、使用和存储块,以及它们在...
- NSNotifications与KVO(Key-Value Observing)的内存管理注意事项。 4. **数据持久化**: - UserDefaults适合存储少量轻量级数据。 - CoreData用于复杂对象的持久化管理。 - SQLite数据库操作,如SQL语句编写...
- **注意事项**:避免循环引用,使用`__block`或`__weak`关键字;注意内存管理,不要造成内存泄漏。 - **Block与代理、通知的区别**: - **代理**主要用于类之间的解耦通信,定义一组协议来指定类的行为。 - **...
17. **Swift与Objective-C的互操作性**:理解桥接头文件,以及在Objective-C项目中使用Swift代码的注意事项。 18. **App的生命周期**:理解不同状态下的生命周期方法,如App进入后台、恢复前台、终止等状态的处理。...
使用GCD与block时的注意事项 - **Block的内存管理**:在使用block时需要注意内存管理问题,特别是避免循环引用的情况发生。 - **非ARC环境下的block使用**:在非ARC环境中(即MRC环境下),需要显式声明`__block`...
**四、KVC的局限性与注意事项** 1. **性能影响**:虽然KVC提供了便利,但相比直接访问属性,其性能稍有下降,因此在性能敏感的代码段中应谨慎使用。 2. **类型安全**:KVC不提供静态类型检查,可能导致运行时错误...
- 初始化过程中的注意事项。 - **重要性**:正确的内存管理能够提高应用性能并减少崩溃风险。 5. **1.3 Defining Two or More Methods with the Same Name in an Object(在对象中定义两个或多个同名方法)** - ...
- **注意事项**: 在使用 ARC 时通常不需要手动调用。 **3. AutoreleasePool** - **作用**: 延迟释放对象,直到当前的 autorelease pool 被释放。 - **使用场景**: 在循环或批量操作中,减少内存峰值。 **4. ...