2015-05-23 77 views
0

我是新的保留週期,我很困惑,如果我的情況陷入。保留週期與目標選擇器

我有一個單獨的類

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嗎?請幫我澄清一下。

在此先感謝。

回答

1

就我所見,代碼中沒有保留循環。但是,您正在擴展目標的生命週期,直到完成處理數據。

如果你想保持相同的行爲,但發出只有當目標仍然是圍繞一個回調,使用弱引用

這裏是一個很好的文章,可能會幫助http://digitalleaves.com/blog/2015/05/demystifying-retain-cycles-in-arc/

更新:的一個保持週期最常見的情況是互相強關聯:對象→塊和塊→對象。有時候,如果你不小心的話,甚至可以通過使用API​​在內部創建一個保留週期,甚至不知情地介紹它。 ReactiveCocoa(這就是爲什麼他們甚至有宏來對付它,叫做weakifystrongify)。

+0

我的代碼沒有保留週期,因爲從塊到視圖控制器有很強的引用,但沒有從視圖控制器到塊的引用。是對的嗎?順便說一下,感謝您的鏈接,真的有幫助。 – quanguyen

+0

更新我的答案有一點細節 –

+0

所以,我的代碼沒有提出一個保留週期的兩個原因是: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

0

如果你有一個單身人士,即使沒有保留週期,它也不會被解除分配。