我使用数据对象来存储数组数据,当数据加载完成时,我有一个块回调。但问题是这两种方法有不同的实例:
@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>
}
答案 0 :(得分:3)
这是因为你alloc
两次。方法new
只是alloc
和init
的包装。
因此,当您致电[[DWHomeData alloc] initWith...
时,您为第一个DWHomeData
实例分配了内存。
然后,在initWith...
方法中调用new
为DWHomeData
的第二个实例分配内存,然后返回那个第二个实例,但是调用{{} 1}}在第一个实例上。
最简单的解决方案是使用标准替换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];
}];
被包装在静态init方法中,不需要在外面调用它。