如果这是在 Objective C 中使用自定义字符串属性的正确方法,为什么我不能提取正确的数值?

2024-04-10

我正在修改一个早期项目,其中使用标签来识别 1-of-5、1-of-16 或 1-of-10UIButtons。我想根据我的理解用自定义属性替换标签这个答案 https://stackoverflow.com/a/11594662/2348597.

该属性称为myInfo由一个字符串和一个整数组成。这很可能是另一个名称的标签,但它使消息源能够以简单整数标签所不能的方式唯一地识别,从而从我的代码中清除幻数,并有望改进文档。

该属性是使用类别创建的

UIView+自定义属性.m

    #import "UIView+CustomProperties.h"

    @implementation UIView (MyInfo)

    -(void)setMyInfo:(id)info
    {
        objc_setAssociatedObject(self, "_myInfo", info, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }

    -(id)myInfo
    {
        return objc_getAssociatedObject(self, "_myInfo") ;
    }

    @end

And myInfo当我导入时有效objc/runtime.h

UIView+自定义属性。

    #import <objc/runtime.h>

    @interface UIView (MyInfo)
    @property ( nonatomic, strong ) id myInfo;

    @end

我从方法中调用类别(below)在 UIView 中我创建了几组按钮。

    // define type and number of 5, 16 or 10 buttons

    switch (buttonCount) {
        case 5:
            roundButton.myInfo = [NSString stringWithFormat:@"transpose index %i", i ];
            break;
        case 16:
            roundButton.myInfo = [NSString stringWithFormat:@"player index %i", i ];
            break;
        case 10:
            roundButton.myInfo = [NSString stringWithFormat:@"note index %i", i ];
            break;
        default:
            roundButton.myInfo = @“orphan button“;
        break;
   }

为了识别消息源,我尝试删除所有非数字字符myInfo using 这个方法 https://stackoverflow.com/a/1426819/2348597。但是我的选择器方法出现问题forButtons当我尝试删除非数字字符时

- (void)fromButtons:(UIButton*)button                          {
    NSLog(@"Button %ld tapped", (long int)[button tag]);
    NSLog(@"first, %@", button.myInfo);

    NSString *newString = [[button.myInfo componentsSeparatedByCharactersInSet:
                        [[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
                       componentsJoinedByString:@""];

    NSLog(@"then, %@", newString);
    NSLog(@"and %li", (long int)newString);

当我构建并运行并按下按钮 1 时,NSLog上面的语句产生以下日志

    2017-05-25 18:27:33.147 SatGam3[930:607301] Button 1 tapped
    2017-05-25 18:27:33.147 SatGam3[930:607301] first, transpose index 1
    2017-05-25 18:27:33.148 SatGam3[930:607301] then, 1
    2017-05-25 18:27:33.148 SatGam3[930:607301] and 2070247168

请注意,long int原始标签的值是正确的,即 1,而long int从定制属性中恢复的值为 2070247168。

Q.1 首先,这种做法正确吗?

Q.2 如果是这样,有人可以解释一下为什么我要从中提取 9 位数字值吗?myInfo ?


首先,一个与您的问题无关的问题:您使用"_myInfo"因为这里的钥匙有点危险。实际上,您将摆脱它,但它依赖于未承诺的编译器优化。您打赌编译器(可能还有链接器)将确保同一常量字符串的所有副本都引用二进制文件中的同一内存位置。这确实是事实,但它不是语言的一部分。请改用选择器。 http://nshipster.com/associated-objects/

但这不是你的问题。你的问题是这样的:

NSLog(@"and %li", (long int)newString);

newString是(不出所料)NSString*。所以 this 指向该字符串的地址。如果您想将其转换为数字,您需要致电-intValue on it.

也就是说,我不会将此数据编码为字符串。将其编码为数据对象:

@interface ButtonInfo
@property (copy) NSString *name;
@property (assign) NSInteger index;
@end

(or name如果有固定的集合,则可以是枚举)

如果您想让此内容更易于阅读,请添加-description方法。使用类型系统;它可以帮助你。不要尝试将复杂类型编码为字符串。

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

如果这是在 Objective C 中使用自定义字符串属性的正确方法,为什么我不能提取正确的数值? 的相关文章

  • 动态高度 UITableViewCell 内的动态高度 UICollectionView

    我有一个水平的UICollectionView固定到 a 的所有边缘UITableViewCell 集合视图中的项目是动态调整大小的 我想让表视图的高度等于最高集合视图单元格的高度 视图的结构如下 UI表格视图 UITableViewCel
  • JavascriptCore:在 JSExport 中将 javascript 函数作为参数传递

    JavascriptCore是iOS7中支持的新框架 我们可以使用 JSExport 协议将 objc 类的部分内容公开给 JavaScript 在javascript中 我尝试将函数作为参数传递 像这样 function getJsonC
  • 在 Swift 中将 gif 保存到 iOS 照片库

    我正在尝试保存位于已使用 Regift 代码创建的临时文件中的 GIF 图像 Regift https github com matthewpalmer Regift https github com matthewpalmer Regif
  • Cocoapods 测试链接器错误

    每当我构建测试目标 Xcode 生成的标准目标 时 构建都会失败并出现神秘错误 framework not found Pods AppName AppNameTests 我认为这意味着无法找到为我的测试生成的 pod 目标 我的 podf
  • iOS - iPhone 8、8 Plus 和 iPhone X 的设备平台字符串/内部模型[重复]

    这个问题在这里已经有答案了 是什么设备平台字符串即将推出的 iPhone 8 iPhone 8 Plus 和 iPhone X 列表 根据内部型号识别设备的列表如下 对于斯威夫特 func devicePlatform gt String
  • 将声音图形化地表示为波

    我创建了一个记录和播放声音的应用程序 我正在寻找一种显示简单波形的方法 记录声音的表示 不需要动画 只需一个简单的图表 如果可以选择波的子集也很好 当然更好 也播放该部分 总而言之 我正在寻找什么 一种以图形方式将录制的声音表示为波的方法
  • Swift 2 OAuth2 LinkedIn 连接

    我将使用 Swift 2 和 Xcode 7 制作一个本机 iOS 应用程序 用户应该使用 LinkedIn 和 OAuth 2 登录 但我想知道应该如何开始设置 我对 OAuth 2 没有太多经验 有好的教程或示例应用程序吗 我看到了雷
  • ios:如何使用 CGPath 模糊图像?

    我创建了一个 CGPath 区域 如绿色圆圈所示 CGPath区域需要清晰 图像的其余部分将应用模糊或半透明效果 我可以使用以下代码在CGPath内剪切图像 UIGraphicsBeginImageContext view frame si
  • 通过 iBeacon 监控和测距与 CoreBluetooth scanForPeripheralsWithServices 检测信标

    对于 iOS 对想要扫描 BLE 信标 外设的应用程序施加的限制 存在很多困惑 在阅读了几个博客和 Stack Overflow 答案后 我想看看我是否正确理解了所有问题 如果有什么理解错误或者遗漏的地方请指正 我仅指 iOS 7 及更高版
  • 子视图的子层与更高的子视图重叠

    我有一个问题 我正在创建一个UIView这是从方法返回的 这部分很好 但我注意到 当我将子层添加到其中一个子视图时 这些层与子层添加的层次结构中较高的子视图 textView 和 imageView 重叠到testViewCopy出现在这些
  • 如何让应用更新以吸引人的屏幕形式提供给用户? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我最近在使用 Make My Trip 应用程序 我发现每当我启动应用程序时都会出现一个非常有吸引力的应用程序更新弹出屏幕 它说要更新应用程
  • 使用 FFT 执行音频分析

    我已经被这个问题困扰好几天了 并且浏览了几乎所有相关的 StackOverflow 页面 通过这次活动 我现在对 FFT 是什么及其工作原理有了更深入的了解 尽管如此 我在将其实现到我的应用程序中时遇到了极大的困难 简而言之 我想做的是为我
  • 领域数据库对象看起来是空的,但实际上不是

    我在用Realm https realm io对于一个小而简单的项目 我正在使用最新版本的框架 昨天从 Github 编译 和当前 AppStore 版本的 Xcode with Swift 2 1 我正在通过 segue 将 Realm
  • 如何为移动应用程序创建无密码登录

    我有兴趣在移动应用程序和 API 之间构建某种无密码登录 假设我可以控制两者 动机是必须登录对用户来说非常烦人并且存在安全风险 例如 用户将重复使用现有密码 我希望用户能够立即开始使用该应用程序 我想知道是否有一些可行的技术 例如 在移动设
  • Swift Firebase - 如何在使用 queryOrdered(byChild: ).queryEqual(toValue: ) 时获取所有 k/v

    root reviews postABC postId reviewXYZ I want everything under this reviewUID buyerUID 01010 text fast shipping responseT
  • 小视频播放

    根据我从互联网收集的信息 MPMoviePlayerController 类不支持小视频播放 因此 为了死马当活马医 我想知道可以使用什么样的方法来让小视频在屏幕的一角播放 而不中断屏幕的其余部分 到目前为止 我们已经遇到了两种可行的解决方
  • 解包可选值时意外发现 nil - 使用 ALAMOFIRE

    我正在尝试使用 Alamofire 获取 JSON 格式的数据 当我使用一个 URL 时 它工作正常 当我使用另一个 URL 时 我在解包可选值时收到错误 我似乎无法追踪错误来自哪里 我已采取将代码放入 ViewDidLoad 来跟踪错误
  • 如何快速从解析中加载图像?

    我想知道是否有人可以帮助我 我是应用程序开发的新手 我正在从我的应用程序上传图像以在解析文档的帮助下毫无问题地进行解析 let imageData UIImagePNGRepresentation scaledImage let image
  • 方法调用中的插入符[重复]

    这个问题在这里已经有答案了 我正在阅读本教程 并遇到了这行代码 这让我感到困惑 localSearch startWithCompletionHandler MKLocalSearchResponse response NSError er
  • 了解 React Native 中的默认字体大小

    在过去的几个月里 我一直在开发一个 React Native 应用程序 但有些事情总是让我困惑 而我现在正试图弄清楚它的真相 我正在尝试标准化应用程序中的字体大小 正文 标题等 并且正在努力了解 React Native 究竟从哪里获取默认

随机推荐