【问题标题】:Safest way in getting intvalue of an object获取对象的 intvalue 的最安全方法
【发布时间】:2013-11-03 09:05:06
【问题描述】:

简单的问题[Objective-C]:(到目前为止找不到任何解决方案)。

我知道[id intValue];。但是,这会使我的应用程序崩溃,因为 NSString 有时在我的应用程序中可能是<Null>。我可以很容易地检查这是否是`,然后做出相应的决定。但是我有很多这样的情况(不递归使用 for 左右)并且想知道确保我的应用程序不会崩溃的最佳方法是什么。

真诚感谢任何帮助。

编辑:

在我的情况下,我从服务器收到 JSON 响应。我从中创建了一个 NSDictionary 。但是,在我的回复中,我可能会收到<NSNull>(完全像这样,由于服务器 API 存在问题。Objective-C 将此(id)视为 NSNull 类。在这种情况下我应该寻找什么?

【问题讨论】:

  • 在 Objective-C 中,[nil anyMethod] 应该是 nil0。取决于消息签名。
  • 如果NSString 实例是nil,它不会崩溃(在ObjC 中,您可以向nil 发送消息)。最坏的情况,它会返回0。所以问题出在其他地方......
  • 不是nil。它的<NSNull>。请检查我的编辑一次。

标签: objective-c int


【解决方案1】:

有两种最常见的方式:

第一种方法:

检查,字符串是否真的可以响应intValue。或者检查它是NSString 还是NSNumber

NSString *string = ...;
int intValue = ([string respondsToSelector:@selector(intValue)]) ? [string intValue] : 0;

为方便起见,您可以为此编写宏

#define intValueFromAnyObject(obj) ([obj respondsToSelector:@selector(intValue)]) ? [obj intValue] : 0;
int intValue = intValueFromAnyObject(string);

第二种方式(我更喜欢它):

在 NSNull 上写一个类别,这样当你向它发送一个无法识别的选择器(例如 intValue)时它就不会崩溃

@interface NSNull (myExtension)
- (int)intValue;
@end

@implementation NSNull (myExtension)
- (int)intValue
{
    return 0;
}
@end

从现在开始,任何时候你尝试从 NSNull 对象中获取 intValue,你都会得到 0。

【讨论】:

  • 是的!真的很棒!非常感谢。
  • @hybridcattt 这种技术有什么特别的名称,即在不同的文件中定义类(我这样说对吗?)?
  • @iRaviiVooda 在objective-C中叫做Categories
  • @iRaviiVooda 是的,您可以创建新文件 -> Objective-c 类别(这将为您提供现成的模板),并将其导入项目中的 .pch 文件中。在我们的例子中,文件名是 NSNull+myExtension.h 和 NSNull+myExtension.m
  • 你救了我的命!
【解决方案2】:
int value = (string) ? [string intValue] : 0;

字符串为nil时的0或其他返回值

【讨论】:

  • 这只检查字符串是否不为零,这与问题完全无关
  • 你能重新提出你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 2012-05-24
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多