我是新的保留週期,我很困惑,如果我的情況陷入。保留週期與目標選擇器
我有一個單獨的類
Singleton.h
@interface Singleton : NSObject
+ (Singleton *)sharedInstance;
- (void)doSomethingWithData:(NSDictionary *)data untilDoneReturnToTarget:(id)target selector:(SEL)selector;
@end
Singleton.m
@implementation RequestSingleton
static Singleton *shared = nil;
#pragma mark - System
- (id)init {
self = [super init];
if (self) {
}
return self;
}
#pragma mark - Interface
+ (Singleton *)sharedInstance {
static dispatch_once_t pred;
dispatch_once(&pred, ^{
shared = [[Singleton alloc] init];
});
return shared;
}
- (void)doSomethingWithData:(NSDictionary *)data untilDoneReturnToTarget:(id)target selector:(SEL)selector {
[someClass doSomething:data
completionHandler: ^{
if ([target respondsToSelector:selector]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[target performSelector:selector
withObject:someObject]; // is this a retain-cycle?
#pragma clang diagnostic pop
}
}];
}
現在,在一個視圖控制器,我請doSomethingWithData:untilDoneReturnToTarget:selector:
在Singleton
類中定義:
- (void)function {
Singleton *singleton = [Singleton sharedInstance]
[singleton doSomethingWithData:someData
target:self
selector:@selector(processResult:)];
}
- (void)processResult:(id)data {
…
}
我不確定我在doSomethingWithData:untilDoneReturnToTarget:selector:
的實施是否落入保留週期?我應該在塊實現中使用weakTarget
而不是target
嗎?請幫我澄清一下。
在此先感謝。
我的代碼沒有保留週期,因爲從塊到視圖控制器有很強的引用,但沒有從視圖控制器到塊的引用。是對的嗎?順便說一下,感謝您的鏈接,真的有幫助。 – quanguyen
更新我的答案有一點細節 –
所以,我的代碼沒有提出一個保留週期的兩個原因是:1)'doSomethingWithData:untilDoneReturnToTarget:selector:'在'Singleton'中調用'doSomething:completionHandler:',是'someClass'的一個靜態函數,所以這是一個本地塊,如[link](http://digitalleaves.com/blog/2015/05/demystifying-retain-cycles-in-arc/)所述。2)As你提到,如果A→B和B→A(都是強的),創建保留週期,在我的情況下:A→B和B→C(A:singleton,B:塊產生由'someClass',C:視圖控制器)。你是否同意我的觀點? – quanguyen