【发布时间】:2012-11-21 22:12:02
【问题描述】:
我想实现类似于NSNotificationCenter 的-addObserverForName:object:queue:usingBlock: 的行为。使用类似的方法
- (void)addRefetchObserver:(id)observer
handler:(FJRefetchHandler)handler;
应该存储一个块以供以后调用(FJRefetchHandler 定义如下:typedef void(^FJRefetchHandler)(void)。
因为以后要删除块,所以我也存储observer,并声明如下方法:
- (void)removeRefetchObserver:(id)observer;
用法如下所示:
// some place in code
[controller addRefetchObserver:self handler:^{
// refetch some stuff, i.e.
self.data = [self updateData];
}];
// some other place in code:
[controller removeRefetchObserver:self];
我的问题是:我应该如何实现-addRefetchObserver:handler:,这样我就不会创建任何保留周期?我应该如何存储观察者和处理者?
显然,NSNotificationCenter 以某种方式存储观察者而不保留它 - 否则我将无法在 -dealloc 中调用 [center removeObserver:self],因为永远不会调用 -dealloc。
另外,在块中引用self 时,有没有办法绕过使用__unsafe_unretained?即像这样:
__unsafe_unretained MyObject *blockSelf = self;
[controller addRefetchObserver:self handler:^{
blockSelf.data = [blockSelf updateData];
}];
【问题讨论】:
标签: iphone objective-c memory-management objective-c-blocks