2013-02-08 143 views
0

讓我們假設我有一個類ClassA的錯誤的委託聲明

頭:

@interface ClassA : NSObject 
- (id)initWithDelegate:(id)delegate; 
@end 

實現:

@interface ClassA() 
{ 
    NSObject *_delegate; 
} 
@end 

@implementation 
- (id)initWithDelegate:(id)delegate 
{ 
    self = [super init]; 
    if(self) 
    { 
     _delegate = delegate; 
    } 

    return self; 
} 
@end 

因爲我跳過了@property定義我的委託聲明默認爲強?所以這段代碼是錯誤的,因爲它會導致泄漏,或者我的delagate聲明默認爲弱?

回答

0

這是最好的編寫代碼的方式,使這個明確的:

@interface ClassA : NSObject 
@property(weak) id delegate; // or @property(weak, readonly) 
@end 

@implementation ClassA 

- (id)initWithDelegate: (id) delegate 
{ 
    self = [super init]; 
    _delegate = delegate; 
    return self; 
} 

@end 

默認情況下,實例變量將是強有力的。

+0

感謝您的回答 – cuda

1

您必須將該ivar限定爲__weak。伊娃的默認值很強。

否則,正如您已經知道的那樣,您將面臨與代表保留週期的風險。

順便說一句,這裏的約定是'id'而不是NSObject *。

+0

感謝您的回答 – cuda

0

你是對的,這將導致ARC保留_delegate,即做一個「強」的引用。如果你想創建一個沒有聲明@property弱引用,你可以使用

@interface ClassA() 
{ 
    __weak id _delegate; 
} 
@end 
+0

感謝您的回答 – cuda

+0

如果你喜歡的答案,給予好評,並/或標記爲已「正確答案」請:-) – DaGaMs