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

Ios 如果这是在目标C中使用自定义字符串属性的正确方法,为什么’;我不能提取正确的数值吗?,ios,objective-c,uibutton,nsstring,objective-c-category,Ios,Objective C,Uibutton,Nsstring,Objective C Category,我正在修改一个早期的项目,其中我使用标签来标识五分之一、十六分之一或十分之一的按钮。我想根据我的理解,用定制属性替换标签 名为myInfo的属性由后跟整数的字符串组成。这很可能是另一个名称的标记,但它以一种简单整数标记无法识别的方式唯一地识别消息源,从而清除了代码中的幻数,并有望改进文档 属性是使用类别创建的 UIView+CustomProperties.m #import "UIView+CustomProperties.h" @implementation UIView

我正在修改一个早期的项目,其中我使用标签来标识五分之一、十六分之一或十分之一的按钮。我想根据我的理解,用定制属性替换标签

名为
myInfo
的属性由后跟整数的字符串组成。这很可能是另一个名称的标记,但它以一种简单整数标记无法识别的方式唯一地识别消息源,从而清除了代码中的幻数,并有望改进文档

属性是使用类别创建的

UIView+CustomProperties.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
当我导入
objc/runtime.h

UIView+CustomProperties。

    #import <objc/runtime.h>

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

    @end
为了识别消息源,我尝试使用删除
myInfo
中的所有非数字字符。但是,当我尝试删除非数字字符时,按钮的选择器方法
中出现了一个问题

- (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
值是207024168

问题1:首先,这种方法正确吗


问题2:如果是这样,有人能解释一下为什么我要从
myInfo
中提取一个9位数的数值吗?

首先,一个与您的问题无关的问题:您使用
“\u myInfo”
作为这里的键有点危险。在实践中,您可以侥幸逃脱,但它依赖于编译器优化,而这并不是承诺的。您打赌编译器(可能还有链接器)将确保相同常量字符串的所有副本都引用二进制文件中的相同内存位置。这是真的,但它不是语言的一部分

但那不是你的问题。你的问题是:

NSLog(@"and %li", (long int)newString);
newString
是(毫不奇怪的)一个
NSString*
。这就是那个字符串的地址。如果你想把它转换成一个数字,你需要在上面调用
-intValue

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

@interface ButtonInfo
@property (copy) NSString *name;
@property (assign) NSInteger index;
@end
(或
name
如果有固定的枚举集,则可以是枚举)


如果要使其更易于阅读,请添加
-description
方法。使用类型系统;它在那里帮助你。不要试图将复杂的类型编码为字符串。

请使用以下代码行:

NSLog(@"and %li", [newString intValue]);

你的方法是正确的。

Rod,这必须是公认的答案。提供的每个解决方案都解决了与使用
NSString
相关的问题,但这个答案也证实了我的怀疑,即。以另一种方式编码信息可能更好。即使没有
-description
,对于
*名称
索引
也有一个单独的按钮属性,这样就更清晰了。谢谢
NSLog(@"and %li", [newString intValue]);