2014-01-20 19 views
2

我想知道爲了避免保留週期而需要創建一個要在塊內使用的類型的__weak版本的所有鍋爐板。 我使用的經典的方式是:一個宏得到一個塊的弱類型

__weak typeof(self) weakSelf = self; 

我的直接的解決辦法是定義像一個新功能:

#define weakTypeof(type) __weak typeof(type) 

好吧,這不是一個很大的進步,但我們失去不得不鍵入__weak無處不在:

weakTypeof(self) weakSelf = self; 

我有什麼理由不應該這樣做嗎?
有沒有更好/更有效的方法呢?

回答

3

我認爲這可能是一樣容易寫:

__weak typeof(self) weakSelf = self; 

它是一條什麼東西,任何人誰讀你的代碼可以立即明白的樣板一行代碼。如果你使用片段,幾乎不需要花費任何可觀的時間來編寫。

如果您使用宏,最終的代碼長度與原始語句的長度幾乎相同,所以您沒有花費太多時間並且犧牲了可讀性,因爲您仍然需要知道宏的功能。

所以,在我看來(你知道我的意見是什麼),這不是你需要擔心的。試圖簡化它,你什麼也得不到。

編輯

要添加到我的說法。我敢肯定,你的線沿線的多條線路:

@property (strong, nonatomic) UIView *someSubview; 
@property (weak, nonatomic) id<SomeDelegateProtocol> delegate; 
@property (copy, nonatomic) NSString *someString; 

如果你認爲這是一個主意,有這些宏,所以你可以這樣寫:

propStrong UIView *someSubview; 
propWeak id<SomeDelegateProtocol> delegate; 
propCopy NSString *someString; 

然後繼續前進併爲你的weakSelf聲明實施一個宏。

但是,如果您認爲原始版本只是常見的樣板文件,如果編寫時間稍長一點,並且每個人都可以乍一看就能理解,那麼我認爲您不必擔心未裝飾的weakSelf聲明。

1

雖然我同意@abizern回答代碼的可讀性勝過寫作速度的事實,但我發現這個project有趣的方法,並且爲了爭論起見,我認爲將它發佈是個好主意。
作者在這裏創建一個宏來創建一個變量的弱拷貝,如@weakify(<a_variable>),然後使用@weakify(<a_variable>)在塊內引用它。 這個項目也包含在ReactiveCocoa中並被廣泛使用。

有很多在源文件中的宏,主要是爲了應付的事實,實際上你可以打電話@weakify()@strongify()有多個變量作爲自變量,但我成功地減少了所有的代碼這個例子在這裏:

#define metamacro_concat(A, B) A ## B 
#define weakify(VAR) \ 
    autoreleasepool {} \ 
    __weak __typeof__(VAR) metamacro_concat(VAR, _weak_) = (VAR) 
#define strongify(VAR) \ 
    autoreleasepool {} \ 
    _Pragma("clang diagnostic push") \ 
    _Pragma("clang diagnostic ignored \"-Wshadow\"") \ 
    __strong __typeof__(VAR) VAR = metamacro_concat(VAR, _weak_)\ 
    _Pragma("clang diagnostic pop") 

...

NSString *string = @"test"; 

@weakify(string); 

[anyObject asyncBlock:^{ 

    @strongify(string); 
    NSLog(@"%@", string); 
}];