【面试题解答】如何在一个对象释放的时候收到通知

上回书说到,不能子类化,不能KVO,不能替换这个对象的类,如何在这个对象释放的时候收到通知呢?


用runtime的Associated Object机制可以做到。


我们知道,被objc_setAssociatedObject 方法关联的对象,生命周期是和主对象相同的,即,主对象dealloc时这个associated的对象随后执行dealloc,利用这点我们就可以造个辅助对象:


@implementation XXDeallocAttachment {

void(^_block)(void);

}

- (instancetype)initWithDeallocBlock:(void (^)(void))block {

self = [super init];

if (self) {

self->_block = [block copy];

}

return self;

}

- (void)dealloc {

if (self->_block) {

self->_block();

}

}

@end


随后把想要监听释放的对象associate一个辅助对象:


XXDeallocAttachment *attach = [[XXDeallocAttachment alloc] initWithDeallocBlock:^{

// Do whatever you want

}];

objc_setAssociatedObject(obj, key, attach, OBJC_ASSOCIATION_RETAIN);


还有更简单的或更奇葩的方法欢迎继续讨论- -

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然没问!下面是10个关于Java IO的面试及其解答: 1. 什么是Java IO? Java IO (Input/Output)是Java编程语言中用于处理输入和输出的API。它提供了读取和写入数据的方式,包括文件、网络连接和其他输入/输出流。 2. Java IO中的流是什么意思? 流是一种操作数据的方式,它将数据从源传输到目标。在Java IO中,流可以是输入流(用于读取数据)或输出流(用于写入数据)。 3. Java IO中的字节流和字符流有何区别? 字节流(Byte Stream)操作字节数据,而字符流(Character Stream)操作字符数据。字节流适用于处理二进制数据(如图像或音频文件),而字符流适用于处理文本数据。 4. 如何使用Java IO从文件中读取数据? 可以使用FileInputStream类来从文件中读取数据。首先创建一个FileInputStream对象,然后使用read()方法读取数据,并使用close()方法关闭流。 5. 如何使用Java IO将数据写入文件? 可以使用FileOutputStream类来将数据写入文件。首先创建一个FileOutputStream对象,然后使用write()方法写入数据,并使用close()方法关闭流。 6. 什么是缓冲流?为什么要使用它? 缓冲流(Buffered Stream)是一种性能优化的流,它使用缓冲区来减少对底层资源(如磁盘或网络)的访问次数,从而提高读写效率。 7. 如何使用缓冲流读取文件? 可以使用BufferedReader类来读取文件。首先创建一个FileReader对象,然后将其传递给BufferedReader构造函数。接下来,使用readLine()方法逐行读取文件内容。 8. 如何使用缓冲流写入文件? 可以使用BufferedWriter类来写入文件。首先创建一个FileWriter对象,然后将其传递给BufferedWriter构造函数。接下来,使用write()方法写入数据,最后使用flush()方法刷新缓冲区。 9. 什么是序列化?如何实现Java对象的序列化? 序列化是将对象转换为字节流的过程,以便可以将其存储在文件中或通过网络传输。要实现Java对象的序列化,需要实现Serializable接口,并定义一个特殊的serialVersionUID字段。 10. 如何使用Java IO进行网络编程? 可以使用Socket类和ServerSocket类来实现基于TCP/IP的网络编程。Socket类用于创建客户端套接字,ServerSocket类用于创建服务器套接字。通过这些类,可以在网络上发送和接收数据。 希望以上面试及其解答对你有所帮助!如果你还有其他问,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值