gpt4 book ai didi

iOS - 我应该在这个 block 中调用 "weakSelf"吗?

转载 作者:行者123 更新时间:2023-12-01 18:47:28 25 4
gpt4 key购买 nike

好的,所以我可能还没有完全掌握何时应该使用 weakSelf以 block 为单位。我知道这样做是为了防止保留周期等等,但我听说这条规则有一些异常(exception)。

在以下代码中,我检查 API 调用是否由于登录 session 到期而失败,然后我尝试重新验证用户并通过调用 [self sendTask:request successCallback:success errorCallback:errorCallback]; 重试因此问题而失败的 API 请求。在重新认证方法的成功 block 中:

/*!
* @brief sends a request as an NSHTTPURLResponse. This method is private.
* @param request The request to send.
* @param success A block to be called if the request is successful.
* @param error A block to be called if the request fails.
*/
-(void)sendTask:(NSURLRequest*)request successCallback:(void (^)(NSDictionary*))success errorCallback:(void (^)(NSString*))errorCallback
{
NSURLSessionDataTask *task = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
[self parseResponse:response data:data successCallback:success errorCallback:^(NSString *error) {
//if login session expired and getting "not authenticated" error (status 401)
NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
if (httpResp.statusCode == 401) {
NSLog(@"NOT AUTHENTICATED THO");
AuthenticationHelper* auth = [AuthenticationHelper sharedInstance];
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
//attempt to re-authenticate the user
[AuthenticationHelper loginUser:[defaults stringForKey:@"username"] password:[defaults stringForKey:@"password"] successCallback:^(User* u)
{
auth.loggedInUser = u;
NSLog(@"RE-AUTHENTICATION BUG FIX SUCCEEDED");
//attempt to re-try the request that failed due to
[self sendTask:request successCallback:success errorCallback:errorCallback];
} errorCallback:^(NSString *error) {
NSLog(@"RE-AUTHENTICATION BUG FIX FAILED");
}];
}
else {
errorCallback(error);
}
}];
}];
[task resume];
}

这是不好的做法,因为它会导致保留周期吗?如果是这样,为什么?我应该改用 [weakSelf sendTask:request successCallback:success errorCallback:errorCallback];假设我做 MyAPIInterface *__weak weakSelf = self;预先?

最佳答案

在此示例中,不会有保留周期,因为 self不持有对该 block 的引用。当 block 完成时,它将释放对 self 的保留。 ,如果这是最后一次引用,实例将被释放,正如您所期望的那样。

关于iOS - 我应该在这个 block 中调用 "weakSelf"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34280776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com