为什么阻止无法捕获自我?

时间:2015-10-07 07:09:52

标签: ios objective-c

我使用数据对象来存储数组数据,当数据加载完成时,我有一个块回调。但问题是这两种方法有不同的实例:

@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>
}

1 个答案:

答案 0 :(得分:3)

这是因为你alloc两次。方法new只是allocinit的包装。

因此,当您致电[[DWHomeData alloc] initWith...时,您为第一个DWHomeData实例分配了内存。 然后,在initWith...方法中调用newDWHomeData的第二个实例分配内存,然后返回那个第二个实例,但是调用{{} 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方法中,不需要在外面调用它。