子类化 NSNumber

2024-03-27

我想向 NSNumber 类添加一个属性,因此我必须对其进行子类化。文档指出我必须重写所有 NSValue 原始方法。由于 NSValue 文档没有说明哪些方法是原始方法,所以我认为这两个可能是实例化的原始方法:

– initWithBytes:objCType:  
+ valueWithBytes:objCType:

所以我把我的课程设置为:

@interface MultipleNumber : NSNumber {  
    NSNumber *_number;  
}  
@property (nonatomic, getter = isMultiple) BOOL multiple;  
@end

@implementation MultipleNumber  
@synthesize multiple=_multiple;  

-(id)initWithBytes:(const void *)value objCType:(const char *)type {  
    self = [super init];  
    if (self) {
        _number=[[NSNumber alloc] initWithBytes:value objCType:type];
    }
    return self;
}

+(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type {
   return [[[MultipleNumber alloc] initWithBytes:value objCType:type] autorelease];
}

-(void)getValue:(void *)value { [_number getValue:value]; }

-(const char *)objCType { return [_number objCType]; }

@end

但是当我调用 [NSNumber numberWithBool:YES] 时,我仍然得到一个 _NSCFBoolean 类,并且不会调用“原始方法”。 我如何找出哪些方法被认为是原始方法?


你不需要子类化NSNumber为了添加一个属性。您可以使用更轻松地添加属性关联参考 http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocAssociativeReferences.html。子类化NSNumber非常棘手,因为它是一个类簇。


编辑:@Remco 在他对 @diablosnuevos 的评论中提出了一个重要的观点,我想在回答中指出这一点:

是的,我最终通过反复试验做了一个子类,因为返回的 NSNumbers 是共享实例,因此存储关联的引用也是共享的。 – 雷姆科·波尔斯特拉 5 月 16 日 9:09

这是一件非常重要的事情,需要记住。NSNumber缓存从 -1 到 12 的整数并将它们视为单例。在 OSX 10.7 中,NSNumber被实现为标记指针(尚未深入研究那里关联引用的含义)。关键是,虽然关联的引用非常有用,但可能存在一些会让您感到烦恼的底层实现细节。

这里更深刻的教训是子类化或增强NSNumber probably无论如何都不是一个好主意。NSNumber是一个非常低级的对象。几乎可以肯定的是,建立另一个拥有NSNumber, 很像NSAttributedString拥有一个NSString而不是延伸NSString.

我不知道这里要解决的问题的具体情况,但遇到的问题是一个有趣的教训。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

子类化 NSNumber 的相关文章

  • QuickBlox:arm64 架构的未定义符号

    我使用 Xcode 6 4 并使用 cocoapods 安装了 QuickBlox 框架 使用该框架后 我收到一些错误 例如 Undefined symbols for architecture arm64 OBJC CLASS QBSet
  • UINavigationController:iPad 上正在呈现视图控制器,同时关闭另一个控制器

    我有一个需要用户登录的视图 当用户尝试打开该视图但他尚未登录时 我将调用登录视图供他登录 完成后我将调用他想要的原始视图查看 在 iPhone 上 当我将视图控制器推到那里时 这工作得很好 但在我展示视图控制器的 iPad 上 这不起作用
  • 检查自定义键盘扩展的完全访问权限

    我需要检查自定义键盘扩展的完全访问权限 我找到了这个链接 如何检查 iOS 8 中的 允许完全访问 是否已启用 https stackoverflow com questions 25472388 how to check the allo
  • iphone XMPP 应用程序运行后台

    我使用 XMPP 框架创建了一个聊天应用程序 当我退出应用程序 进入后台模式 时 我想接收聊天消息 并且还需要显示图标徽章 我该怎么做 您确实可以通过将基于 XMPP 框架的应用程序称为 VoIP 应用程序来在 iOS4 中的后台运行该应用
  • 如何在ios中重置触摸、触摸移动的NSTimer

    我正在开发一个应用程序 其中我必须在 3 秒后隐藏控制按钮 所以我使用 NSTimer 编写代码 然后开始触摸 它可以工作 但问题是 当我再次触摸任何其他按钮时 我的计时器不会重置 即使我像拖动一样移动我的触摸示例 如果我拖动或移动触摸 它
  • 如何让 NSURLRequest 获取 Twitter 请求令牌?

    我正在尝试使用以下代码从 Twitter 获取请求令牌 NSMutableURLRequest mURLRequest NSMutableURLRequest alloc initWithURL NSURL URLWithString ht
  • XCTestCase:ld:未找到架构 x86_64 的符号

    我只是想实现我的第一个 XCTestCase 实现 一切都构建良好 但是当我执行测试用例时 我面临 构建失败 Undefined symbols for architecture x86 64 OBJC CLASS Node referen
  • 检查 Objective-C 中从 JSON 字符串返回的空值

    我有一个JSON来自网络服务器的对象 日志是这样的 status success UserID 15 Name John DisplayName John Surname Smith Email email Telephone null F
  • UIPageControl 未显示

    我使用以下内容来显示滚动视图和页面控制 scrollView UIScrollView alloc initWithFrame CGRectMake 0 0 320 179 pageControl UIPageControl alloc i
  • 使用 MPVolumeView 滑块调整音量时隐藏设备音量 HUD 视图

    我在 iPad 应用程序中使用 MPMoviePlayer 实现视频播放器 使用 MPVolumeView 进行音量控制 我的问题是 当我滚动音量视图来调整音量时 会显示设备的音量平视显示器覆盖 如下面的屏幕截图所示 如何禁用此系统音量指示
  • valgrind 和 iOS SDK 4.2?

    使用 valgrind 运行 iOS 4 2 应用程序时遇到问题 我从 Macports 安装了 valgrind 3 6 0 SVN Xcode 3 2 5 当我修改 main 以运行 valgrind 时 我得到以下输出 Detecte
  • iOS UITableViewCellAccessoryCheckmark 在每次滚动时可见

    我有一个列表 我将其用作复选框 我已启用或禁用选择行上的复选标记 但是当我滚动列表时 它会在每 10 行之后标记行 void tableView UITableView tableView didSelectRowAtIndexPath N
  • 从 NSString 获取子字符串,直到到达特定单词

    假设我有这个NSString Country Address Tel number 我该如何获取之前的子字符串Tel 国家地址 然后我该如何获取后面的子字符串Tel 数字 使用 NSScanner NSString string Count
  • 更改 UINavigationBar 中 UIBarButtonItem 的位置

    如何更改 UIBarButtonItem 在 UINavigationBar 中的位置 我希望我的按钮比正常位置高约 5 像素 此代码为 UINavigationBar 创建一个具有图像背景和自定义位置的后退按钮 诀窍是创建一个中间视图并修
  • iOS:在代码中访问 app-info.plist 变量

    我正在开发通用应用程序 并且希望访问代码中 app info plist 文件中存储的值 原因 我使用以下方法从故事板动态实例化 UIViewController UIStoryboard storyboard UIStoryboard s
  • 存储和检索多维 NSMutableArray 的最佳方法是什么?

    我将一堆数据存储在 plist 文件 在应用程序文档文件夹中 中 其结构如下 Dictionary description String Value sections Array Array Number Number Array Numb
  • iphone navigationController :在退出当前视图之前等待 uialertview 响应

    我有一个带有由导航控制器管理的后退按钮的视图 我想在用户单击后退按钮时检查文件是否已保存 如果文件已保存 您将返回到上一个视图 否则 uialertview 会询问您是否要保存文件 所以我这样做了 但视图消失了 然后警报视图出现了 void
  • stringFromDate 始终为 NIL

    我知道这是一个重复的问题 但是在 stackoverflow 和 google 上搜索了许多类似的问题后 没有一个解决方案对我有用 我正在尝试将从数据库收到的日期转换为字符串格式以在 iPhone 应用程序中显示 我正在按以下方式将日期转换
  • CF 类型的带有 __attribute__((NSObject)) 的强 @property 不会保留

    更新 自 Xcode 4 6 起 此问题已得到修复 现在 这项技术再次按预期发挥作用 但是 在代码中使用之前 请务必阅读 Rob Napier 出色答案顶部的注释 原帖 ARC Xcode 4 3 1 iOS 5 1 我有一个 CF 类型
  • 将 Objective-C 框架 (CocoaPod) 导入 Swift?

    我正在尝试导入libjingle peerconnection框架到我的 Xcode 项目中 但由于某种原因 我无法使用以下命令导入 Objective C 标头import RTCICEServer在 Swift 源文件中 我尝试使用头文

随机推荐

  • 获取地点的纬度和经度 dbpedia

    我想获取一个我已经知道其名称的地点的纬度和经度 PREFIX geo
  • 有没有办法从 Ruby 中的实例调用私有类方法?

    以外self class send method args 当然 我想在类和实例级别提供一个相当复杂的方法 而不需要重复代码 UPDATE Jonathan Branam 这是我的假设 但我想确保没有其他人找到解决方法 Ruby 中的可见性
  • Objective-C:检查是否使用枚举选项

    我有一个使用 typedef 枚举的自定义对象 如果我为对象设置了一些枚举选项 如何检查这些选项是否正在使用 typedef enum Option1 Option2 Option3 Options 创建对象时我可能会使用 myobject
  • 异步 ASP.NET Web API 中的 ThreadStatic

    是否有可能在单个请求中使用线程静态变量 当前代码使用线程静态变量进行日志记录 现在我们想要使用异步控制器方法 具有异步和等待模式 这会导致问题 因为打开新线程时该变量为空 await会导致线程跳转 所以线程静态变量自然会出现问题 要解决此问
  • 实现 MutationObserver 代替 DOMSubtreeModified

    我有一个select multiple 我已经上过课custom multiselect在我正在捕捉的页面上DOMSubtreeModified事件如下 HTML
  • 使用Python直接向USB发送信号

    如何使用 Python 将 USB 端口连接设置为高或低 这可用于定制 USB 设备 例如 假设我有一个 LED 连接到 USB 端口 数据线 现在通过代码我想闪烁它或控制它 现在 这可以通过使用任何微控制器 Arduino Raspber
  • Android studio 的aspectj - AJDT 插件在哪里

    如何为 android studio 安装 AJDT 我知道 Eclipse 有一个 但我在 android studio 中找不到任何东西 我想做的是在启动之前对我的每个方法调用进行安全检查 我已经从这个网站尝试过AJDT http ec
  • 如何使用 ant build.xml 导入现有的 java web 项目

    我正在尝试使用导入功能将现有的 java web 项目 使用 ant build xml 构建 导入到 Eclipse 中 但 Eclipse 无法将其识别为项目 如何将项目导入到eclipse中 编辑 我所做的是将项目导入为 Java 项
  • 从 GitHub 上已删除的分支恢复作为拉取请求发送的提交

    我做了一件蠢事 I fork在 GitHub 上发布了一个存储库 我做了一些改变 commit把它们放在我的叉子上 我将此提交作为拉取请求回到原来的仓库 愚蠢的部分来了 我deleted 我的叉子 原始存储库的所有者要求在接受拉取请求之前对
  • 图例显示带有 geom_vline 的意外黑线

    在查看了 StackOverflow 上提供的一些答案后 我一直试图添加一个额外的图例 但不知何故我无法完成这项工作 我正在使用以下代码 x breaks lt seq as Date 2010 1 1 as Date 2015 4 1 m
  • 函数隐私和单元测试 Haskell

    你如何处理 Haskell 中的函数可见性和单元测试 如果导出模块中的每个函数以便单元测试可以访问它们 则可能会导致其他人调用不应出现在公共 API 中的函数 我想用 LANGUAGE CPP 然后围绕出口 ifdef LANGUAGE C
  • git svn:svn 的密码未存储

    我正在使用 git svn 对中央远程 svn 存储库使用 git SVN 存储库使用带有自签名证书的 https 一切正常 只有一个令人讨厌的例外 只要我直接使用 svn 密码就会被记住 所以只能在第一个命令中输入密码 当使用git sv
  • window.onload 与

    两者到底有什么区别window onload事件和onload事件的body标签 我什么时候使用哪个以及如何正确完成 window onload myOnloadFunc and 是不同的使用方式同一个事件 Using window onl
  • 如何使用 ScriptTags 为 shopify 开发 Rails 应用程序

    我在 Heroku 中部署了一个 Shopify 应用程序 并使用 Rails 开发 我需要从任何 Shopify 商店的前端调用 JavaScript 函数 我读过这篇文章 http www shopify com technology
  • Appcelerator Titanium:Facebook 图片上传失败

    我的 Titanium 软件中从 Facebook 上传图像时出现错误 每次我想从我的应用程序上传图像时 我都会收到以下信息 失败 v2 1 及更高版本已弃用 REST API 但如果我在 KitchenSink 示例应用程序中尝试相同的代
  • 在设计模式中编辑集合的最简单方法?

    最简单的编辑方法是什么persist像这样的集合decimal or List
  • 在 Python 上分析字符串输入直到达到某个字母

    我需要帮助来尝试编写程序的某个部分 这个想法是 一个人输入一堆乱码 程序会读取它 直到它到达 感叹号 例如 input Type something 人物类型 wolfdo65gtornado salmontiger223 如果我要求程序打
  • `enable_query_strings` 无法正常工作

    我正在尝试使用 CodeIgniter 和 xdebug 当我输入以下 URL 时 http localhost redux index php xdebug 运行良好 当我访问以下网址时 http localhost redux inde
  • QT后台进程进行键盘输入嗅探

    我正在开发一个简单的应用程序 该应用程序将在后台运行并捕获用户的键盘输入 如键盘记录器 但用于 LAN 我正在发送 UDP 数据包来传输击键 但从后台进程捕获键盘输入的问题似乎仍然无法解决 所以需要帮助 如果您想在 Windows 上执行此
  • 子类化 NSNumber

    我想向 NSNumber 类添加一个属性 因此我必须对其进行子类化 文档指出我必须重写所有 NSValue 原始方法 由于 NSValue 文档没有说明哪些方法是原始方法 所以我认为这两个可能是实例化的原始方法 initWithBytes