2015-10-07 24 views
1

我用一個數據對象來存儲數組數據,當數據加載完成時,我有一個塊回調。但問題是,有兩個方法的不同實例:爲什麼阻止不能捕捉自己?

@implementation DWHomeData 

- (instancetype)initWithDataLoadCompletion:(void (^)(BOOL))completion 
    DWHomeData *data = [DWHomeData new]; 
    data.dwStatus = [@[] mutableCopy]; 
    _completion = [completion copy]; 
    [self loadStatusData]; 
    return data;//<DWHomeData: 0x7fb481546860> 
} 

- (void)loadStatusData { 
    DWHomeParam *param = [DWHomeParam new]; 
    [DWHomeTool fetchHomeStatusWithParam:param success:^(NSArray *statusArr) { 
     self.dwStatus = statusArr;//self address:<DWHomeData: 0x7fb481548b00> 
     _completion(YES); 
    } failure:^(NSError *error) { 

    }]; 
} 

@end 

我的回調:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _homeData = [[DWHomeData alloc] initWithDataLoadCompletion:^(BOOL success) { 
     [self.tableView reloadData]; 
    }];//_homeData address:<DWHomeData: 0x7fb481546860> 
} 

回答

3

這是因爲你是alloc荷蘭國際集團兩次。方法new只是allocinit的包裝。

因此,當您撥打[[DWHomeData alloc] initWith...時,您爲第一個DWHomeData分配了內存。 然後,在initWith...方法裏面你調用newDWHomeData的第二個實例分配內存,你返回第二個實例,但是你在第一個實例上調用loadStatusData

最簡單的解決辦法是更換new電話與標準:

self = [super init]; // no alloc 

if (self) { 
    // initialize properties and call methods 
} 

return self; 

或者你可以做我怎麼喜歡做所有的時間:

+ (instancetype)dataWithCompletion:(void (^)(BOOL))completion { // static method 

    DWHomeData *data = [DWHomeData new]; // alloc needed 

    if (data) { 
     [data loadStatusData]; 
    } 

    return data; 
} 

然後調用它,而不分配:

_homeData = [DWHomeData dataWithCompletion:^(BOOL success) { 
    [self.tableView reloadData]; 
}]; 

所以alloc被包裹在裏面靜態初始化方法,並且不需要在外部調用它。

+0

謝謝,我很少使用新的方法。它實際上是alloc和init。所以我明白了。 – DanielG

+0

可以使用它,但你必須記住背後發生了什麼。 –