gpt4 book ai didi

ios - Objective-C 中的类型转换失败

转载 作者:行者123 更新时间:2023-11-28 18:02:47 27 4
gpt4 key购买 nike

这里类型转换成功

id object = [NSMutableArray array];
NSURLConnection *urlCon = (NSURLConnection*)object;

if ([urlCon isKindOfClass:[NSURLConnection class]])
NSLog(@"urlCon is NSURLConnection");
else if ([urlCon isKindOfClass:[NSMutableArray class]])
NSLog(@"urlCon is NSMutableArray"); // this is called

实际上,由于“object”的类型为 NSMutableArray,因此 NSURLConnection 的类型转换应该会失败。但是成功了,urlCon仍然指向NSMutableArray,那么TypeCasting有什么用呢?

最佳答案

有两个不同的问题:一个是变量的类型。另一个是底层对象是什么类型。

在 Objective-C 中,对象指针的转换不会改变底层对象的内容。在 Objective-C 中进行转换不会“成功”或“失败”。它只是告诉编译器允许您将变量视为实际上指向转换类型的对象。你通常在以下情况下这样做:(a)你对编译器无法合理知道的底层对象有一些了解,并且(b)你希望能够调用某个类的某些特定方法而编译器不会提示它.显然,这里不是这种情况,您将 urlCon 变量转换为期望 object 成为 NSURLConnection,但事实并非如此.

但是 isKindOfClass 是一个运行时检查,它实际上查看底层对象是什么类型,而不关心变量被转换为什么类型。


一个常见的模式将使用 isKindOfClass 来确定对象是否属于特定类,如果是,则将其转换为该特定类型,以便您可以使用方法和/或该类的属性没有来自编译器的警告。

所以你会经常在处理网络请求时看到这种模式:

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

if ([response isKindOfClass:[NSHTTPURLResponse class]]) { // check to see if response is `NSHTTPURLResponse`
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; // if so, cast `NSURLResponse` to `NSHTTPURLResponse`
NSInteger statusCode = httpResponse.statusCode; // now you can use `statusCode` property of `NSHTTPURLResponse`

if (statusCode != 200) {
// Non 200 status code ... so handle HTTP error accordingly here
}
}

// carry on
}];
[task resume];

这个模式有稍微简单的演绎,但希望它能说明这个想法:当你知道(或以编程方式确认)有关所指向对象类型的某些信息时,你就进行转换,而你只想让编译器在同一页面上,以便您现在可以使用它。您可以使用 isKindOfClass 作为运行时检查以确认它确实是该类型,但转换允许您这样使用它。

关于ios - Objective-C 中的类型转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37046095/

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