假设我的类有一个名为hotspotsOperation的实例变量(我正在使用RestKit)并且在块内部使用(由RestKit使用NSOperation)。我这样做是因为我希望能够取消正在进行的请求。但是我有一个关于保留周期的问题__block。 基本上,在使用weakify / strongify时我是否必须使用__weak? 还有一个问题,如果我不使用弱化/强化但是将热点操作从强到弱改变,分析器说没有保留周期,是吗?最好是使用弱而不是弱化/强化?在这种情况下,自我会发生什么? 非常感谢任何建议。
#import "HotspotsService.h"
#import "Constants.h"
#import "Restkit.h"
#import "Hotspot.h"
#import <EXTScope.h>
@interface HotspotsService()
@property (nonatomic,strong) RKObjectManager *objectManager;
@property (nonatomic,strong) RKObjectRequestOperation *hotspotsOperation;
@end
@implementation HotspotsService
-(id) init {
self=[super init];
if (self) {
// restkit
// mapping
// response
}
return self;
}
-(void) hotspotsWithRadius:(NSUInteger)rad center:(CLLocationCoordinate2D)coordinate onSuccess:(void(^)(NSArray *hotspots))success onFailure:(void(^)(NSError *error))fail {
[self cancelHotspotsRequest];
NSDictionary *params = // params
self.hotspotsOperation = [self.objectManager appropriateObjectRequestOperationWithObject:nil method:RKRequestMethodGET path:kSolrPath parameters:params];
@weakify(self);
[self.hotspotsOperation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
@strongify(self);
self.hotspotsOperation=nil;
success(mappingResult.array);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
@strongify(self);
self.hotspotsOperation=nil;
fail(error);
}];
[self.objectManager enqueueObjectRequestOperation:self.hotspotsOperation];
}
-(void) cancelHotspotsRequest {
[self.hotspotsOperation cancel];
self.hotspotsOperation=nil;
}
@end
答案 0 :(得分:1)
我会使hotspotsOperation
属性变弱,因为你将操作传递给RestKit进行管理,而你只关心它的生命周期 - 你没有兴趣在这一生中拥有它。这也意味着您不需要在块中捕获self
。
如果您在由self
所拥有的对象保留的块中捕获self
,那么您应该使用弱引用。你如何做到这一点取决于你,但@weakify
似乎非常方便和简单。