Objective-C的指针魔术。类型保护

h3dkandi

我有字典。我提取其值之一,如下所示:

NSString *magicValue= [filterDict valueForKey:[filterDict allKeys][0]];
[SomeClass foo: magicValue];

foo是:

- (void)foo:(NSString*)magicValue
{
    NSLog("magicValue is string:%@",[magic isKindOfClass:[NSString class]] ? @"YES" : @"NO");
    NSLog("magicValue is number:%@",[magic isKindOfClass:[NSNumber class]] ? @"YES" : @"NO");
}

如果字典值为数字,则magicValue将为NSNumber因此,定义的字符串指针将指向NSNumber日志将为数字检查返回“是”。

我从未对此类方法添加保护,以检查“ magicValue”是什么类。我假设当我使用字符串参数定义一个方法时,它将是字符串。

我应该开始考虑这种行为并始终添加检查,还是以这种方式将字典值分配给魔术并使用我的方法的家伙的错。我需要一些最佳做法建议以及如何处理。

这个问题可能已经回答了,但是我不知道如何搜索。

阿敏·内格姆·阿瓦德(Amin Negm-Awad)

简短的回答:不,如果没有特殊原因,请不要检查。

长答案:

您必须区分两种情况:

A.使用 id

您有类型的变量或返回值id这就是您的示例-valueForKey:进行键入的原因是保持方法的通用性。即使从理论上讲也是可能的,但实际上这种情况下的类型不匹配非常少见,并且在开发中很快就被发现了。出于不同的动机,我在公开演讲中问观众(> 200),他们在制作中有多少次出现这种打字错误。对于所有侦听器,其所有应用程序所有版本中的所有应用程序均为1(换句话说:一个!)。只需忘掉这种风险即可。这是开发人员使用静态类型化语言(Java,C ++,Swift)的焦虑。

B.错误的分配

如果您没有id类型,仍然可以进行这种技巧。(有时您想这样做。这是动态类型的优势。)有两个子类别:

您可以隐式地执行此操作:

NSString *string = [NSNumber numberWithInt:1];

编译器会警告您。所以一切都很好,因为开发人员将看到他的错误。您不必保护他或您的代码。

一个人可以明确地做到这一点:

NSString *string = (NSString*)[NSNumber numberWithInt:1];

在这种情况下,代码可能会中断。但是他明确地做到了。如果是错的话,那么开发商就有犯罪的力量去做,而您不必保护他免受自己的侵害。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何知道Objective C指针是否为“ Class”类型?

来自分类Dev

Objective-C 指针类型“NSString *”到 C 指针类型“CFStringRef”错误的奇怪转换

来自分类Dev

为什么 Objective-C 不能在受保护的函数指针中使用“self”对象?

来自分类Dev

在Objective-C中保护代码

来自分类Dev

在objective-c 中,来自不兼容指针类型的类型赋值是否应该总是失败?

来自分类Dev

Objective-C中的指针传递问题

来自分类Dev

Objective-C中的标记指针

来自分类Dev

Objective-C中的id指针

来自分类Dev

难以理解Objective-C中的指针

来自分类Dev

Objective-C:对象实例指针

来自分类Dev

指针VS变量,Objective-C

来自分类Dev

Objective-C:对象实例指针

来自分类Dev

从Objective-C到Swift,指针转换

来自分类Dev

Objective-C指针和快捷

来自分类Dev

Objective-C指针类型'dispatch_source_t'的隐式转换

来自分类Dev

与C指针相比的Objective-C / NSObject指针

来自分类Dev

从Objective C调用C ++

来自分类Dev

指向Objective-C中的错误指针的指针

来自分类Dev

?:在Objective-C中

来自分类Dev

Objective-C:UILocalNotification

来自分类Dev

对于..在objective-c

来自分类Dev

Objective C Converter应用

来自分类Dev

委托Objective-C

来自分类Dev

Objective C结构语法

来自分类Dev

Objective-C:UILocalNotification

来自分类Dev

UISegmentedControl - Objective-C

来自分类Dev

Objective C 内存管理

来自分类Dev

使用类型为“ XYZPerson *”的表达式初始化“ XYZShoutingPerson *”的Objective-C不兼容指针类型

来自分类Dev

将受保护的Objective-C实例变量公开给子类