OC NSNumber NSInteger 直接赋值问题

一 问题描述

类对象的属性id类型是NSNumber ,设置UI 的 tag(NSInteger类型)时候,数据失真。

id属性是1,tag 取出来为19。

1.1 UI tag 属性

//
@property(nonatomic) NSInteger tag;

1.2 错误代码如下

//tagNumber 是 NSNumber 类型
[button setTag:tagNumber];

1.3 修改代码如下

//通过integerValue方法 中转
[button setTag:[tagNumber integerValue]];

1.4 问题模拟

//1.声明 NSInteger 对象
NSInteger integer = 0;
        
//2.声明 NSNumber 对象
NSNumber *number = [NSNumber numberWithInt:3];
        
integer = number;
        
NSLog(@"integer:%d",integer);
NSLog(@"integer:%ld",integer);

===设置的是 3 输出的却是非 3 
integer:50
integer:-5764607523034234830

注意:NSNumber 对象不能直接赋值给NSInteger 变量,会导致数据失真,需要通过方法中转

二 两者区别

NSInteger 是基本类型,是int类型的typedef,被typedef成long(64位) 和的int(32位)

NSNumber 是类,包含多种数据类型的对象,提供多个方法来初始化对象,和其他操作方法

NSNumber.h头文件

- (NSNumber *)initWithChar:(char)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedChar:(unsigned char)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithShort:(short)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedShort:(unsigned short)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithInt:(int)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedInt:(unsigned int)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithLong:(long)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedLong:(unsigned long)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithLongLong:(long long)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedLongLong:(unsigned long long)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithFloat:(float)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithDouble:(double)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithBool:(BOOL)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0) NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0) NS_DESIGNATED_INITIALIZER;

参考stackoverflow:NSNumber NSInteger 两者其别

三 互转方法

//把int 转换成NSNumber
NSNumber *aNumber = [NSNumber numberWithInteger:21];

//把NSNumber 对象转换成 NSInteger
NSInteger anInteger = [aNumber integerValue];
时间: 2024-10-13 04:33:56

OC NSNumber NSInteger 直接赋值问题的相关文章

OC -- NSNumber

// 定义NSNumber的方法1:NSNumber *intNumber = [[NSNumber alloc] initWithInt:5];NSNumber *floatNumber = [[NSNumber alloc] initWithFloat:3.15f];NSNumber *doubleNumber = [[NSNumber alloc] initWithDouble:6.8];NSNumber *charNumber = [[NSNumber alloc] initWithCh

OC -- 迭代器/NSNumber/NSValue/NSRange/NSSet/NSDate 及相互转换.(杂)

//一: 迭代器 // 数组 NSArray *arr= @[@"1",@"2",@"3",@"4",@"5"]; NSEnumerator *enumerator = [arr objectEnumerator]; NSString *str = nil; while (str = [enumerator nextObject]) { NSLog(@"%@",str); } // 字典

OC语言基础

.h(头文件) .m(源文件c.oc) .mm(源文件c.oc.c++) gcc -c      -o    汇编 -framework Foundation链接  NS开头 字符串对象加@ oc中完全兼容c的函数库 NSLog可以自动换行,并且提供文件名编译时间等 需要包含头文件,每一个框架都有一个主头文件,其名字和主头文件相同,主头文件包含了这个框架的所有头文件. #import可以自动防止头文件重复包含. 链接时,需要手动连接框架. 10.多文件编译:所有对象都是以指针形式存在:跟c类似.

OC基础数据类型之字符串,数组和字典

//-------------字符串----------------- //字符串的初始化: //1: NSString *string = @"我是非凡程序员!"; NSLog(@"%@",string); //2: NSString *string2 = [NSString stringWithFormat:@"我在非凡学习了%i个月",1]; NSLog(@"%@",string2); //输出字符串长度: long l

NSNumber 、 NSValue 、 日期处理 、 集合类 、 NSArray(一)

1 基本数据类型的封装 1.1 问题 我们所学的所有基本数据类型,如int.float.double.char等,都不是对象,不能向它们发送消息.然而,在Foundation中的许多类,如NSArray,都要求使用对象作为其值,因此不能将任何基本数据类型直接存储到这些类的对象当中.要存储任何基本数据类型,都必须将这些数据封装成对象. 1.2 步骤 实现此案例需要按照如下步骤进行. 步骤一:封装整型数据 代码如下所示: #import <Foundation/Foundation.h> int

oc总结第三讲 setter getter 方法 点运算符

本次总结oc中成员变量赋值赋值方法----settet.getter命名方法   点运算符 1.settet.getter命名方法 为对象中的某个实例变量赋值的方法称为修改方法,用来修改对象的状态这类修改方法称为setter 另外对应的取之方法称为getter 命名习惯 -setter方法根据所更改的变量名称来命名      例如   变量名为age   则为setAge -getter方法根据所取得的变量名称来命名      例如   变量名为age,直接为age即可 2.点运算符命名方法 点

oc语言学习之基础知识点介绍(一):OC介绍

一.第一个OC程序 #import <Foundation/Foundation.h> //导入头文件 int main(int argc, const char * argv[]) { //main函数 @autoreleasepool {//自动释放池,我们现在写代码最好都写这里面 NSLog(@"Hello, World!"); //输出语句 } return 0; //退出程序,返回一个值给系统看 } 二.OC中的字符串 /* 前缀的概念:(了解一下) 提供框架的作

OC07 -- 迭代器/NSNumber/NSValue/NSRange/NSSet/NSDate 及相互转换.(杂)

//一: 迭代器 //数组 NSArray *arr=@[@"1",@"2",@"3",@"4",@"5"]; NSEnumerator *enumerator = [arr objectEnumerator]; NSString *str = nil; while (str = [enumerator nextObject]) { NSLog(@"%@",str); } // 字典 /

iOS核心面试题

1,请简述你对协议的理解?    protocol无论是在那个领域都是一种约束,规范.在OC中的协议主要用于在各个类之间进行回调传值. 协议有 委托方,代理方, 委托方是协议的制定者,需要声明协议的方法,实现协议的对象.代理方,是协议的遵守着,需要遵守协议,并实现协议中的必要方法. 2,如何理解ARC自动引用计数机制? Cocoa采用了引用计数(referencecounting)机制,每一个对象有一个关联的“整数retainCount”用于记录对象的使用情况.对象被引用时retaincount