gpt4 book ai didi

objective-c - 在 Objective C 中断言对象类

转载 作者:太空狗 更新时间:2023-10-30 03:54:17 25 4
gpt4 key购买 nike

我经常发现自己断言 Objective-C 中某个类的对象“isKindOfClass”。我这样做:

NSAssert([obj isKindOfClass:[AClass class]], @"%@ should be kind of class %@", obj, [[AClass class] description]);

我想知道为它创建捷径的最佳方法。我正在考虑定义一个宏,比如:

#define NSClassAssert(obj, class)  NSAssert([obj isKindOfClass:class], @"%@ should be of class %@", obj, [class description])

我担心这可能会导致一些棘手的编译错误或运行时问题,这样做有什么根本性的错误吗?有没有更好的方法?

最佳答案

首先,您必须确切地问您为什么要这样做。你说:

Given how tolerant and dynamic objective c is, I like to make code "abuse proof". Instead of having an unrecognized selector message, I have a message telling me which class the object was expected to be.

如果您将对象传递给与签名中声明的类型不匹配的方法,即您会执行以下操作:

- (void)doSomething:(NSArray *)array { /* Do something * }

- (void)doSomethingElse
{
NSString *string = @"my string";
[self doSomething:string];
}

您会收到警告,因此您应该在编译时知道对象类型不匹配。

当然,当您使用更通用的类型(例如 id)时,这并不能保护您,但是如果您担心无法识别的选择器,您确实应该检查对象是否响应到那个选择器,而不是使用断言:

- (id)doSomething:(id)obj
{
if ([obj respondsToSelector:@selector(calculateSomething)]) {
return [obj calculateSomething];
} else {
NSLog(@"%@ does not respond to calculateSomething", obj);
}
}

或者使用协议(protocol)来检查方法的可用性。


但是,也就是说,是的,您的宏将用于您的预期目的。

关于objective-c - 在 Objective C 中断言对象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8227385/

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