今天早上有朋友问NSNumber为啥占用8个字节(64bit),请看NSNumber头文件,发现如下代码: @property (readonly) char charValue; @property 我们先做几个试验: NSNumber *number1 = [NSNumber numberWithInt:9]; NSNumber *number2 = [NSNumber numberWithInt :9]; NSNumber *number3 = [NSNumber numberWithInt:5]; NSNumber *number4 = [NSNumber numberWithInt:6]; 的值 所以苹果确实是将值直接存在了指针本身当中了 Google上发现一张NSNumber的内存图,很形象: ? 在64位系统中,如果我们真正使用一个指针来存储NSNumber实例,那么我们首先需要一个8字节的指针,另外需要一块内存存储NSNumber实例,这通常又是8字节。这样的内存开销是比较大的。
NSNumber(只能包装数字类型) NSNumber *num1 = [NSNumber numberWithInt:10]; NSNumber *num2 = [NSNumber numberWithFloat :10.1]; NSNumber *num3 = [NSNumber numberWithBool:YES]; NSNumber *num4 = @10; NSValue(可以包装结构体
实现一个类方法: #import "Adder.h" @implementation Adder +(NSNumber*)add:(NSNumber *)one and:(NSNumber *) anotherNumber { return [NSNumber numberWithFloat:[one floatValue] + [anotherNumber floatValue]]; Foundation.h> #import "Adder.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSNumber * one = [NSNumber numberWithFloat:10]; NSNumber* anotherNumber = [NSNumber numberWithFloat:11.2 ]; NSNumber* result = [Adder add:one and:anotherNumber]; NSLog(@"The Result Is : %@",
最新的LLVM 4.0添加了几个比较有用的特性: @synthesize: 自动为@property添加synthesize 语法: 创建NSArray, NSDictionary, NSNumber的时候 Previously: NSNumber *number; number = [NSNumber numberWithChar:'X']; number = [NSNumber numberWithInt :12345]; number = [NSNumber numberWithUnsignedLong:12345ul]; number = [NSNumber numberWithLongLong:12345ll ]; number = [NSNumber numberWithFloat:123.45f]; number = [NSNumber numberWithDouble:123.45]; number = [NSNumber numberWithBool:YES]; Now: NSNumber *number; number = @'X'; number = @12345; number = @12345ul
NSNumber的创建 以前NSNumber的创建方式 - (NSNumber *)numberWithInt:(int)value; - (NSNumber *)numberWithDouble:(double ; // 将基本数据类型转换为对象类型 NSNumber *ageN = [NSNumber numberWithInt:age]; NSNumber *numberN = [NSNumber numberWithDouble :number]; NSNumber *valueN = [NSNumber numberWithInt:value]; 现在NSNumber的创建方式 @10; @5.1; @YES; @(num); 示例 NSNumber *ageN = @10; NSNumber *numberN = @5.1; NSNumber *valueN = @6; NSNumber *flag = @YES; 3. NSNumber判断大小 判断两个数相等- (BOOL)isEqualToNumber:(NSNumber *)number; NSNumber *num1 = @10; NSNumber *num2
numberWithFloat:1.5]]; [animation setToValue:[NSNumber numberWithFloat:1]]; [animation *number = [NSNumber numberWithDouble:badgePadding]; objc_setAssociatedObject(self, &badgePaddingKey *number = [NSNumber numberWithDouble:badgeMinSize]; objc_setAssociatedObject(self, &badgeMinSizeKey *number = [NSNumber numberWithDouble:badgeOriginX]; objc_setAssociatedObject(self, &badgeOriginXKey *number = [NSNumber numberWithDouble:badgeOriginY]; objc_setAssociatedObject(self, &badgeOriginYKey
= [CIFilter filterWithName:@"CISepiaTone" keysAndValues:kCIInputImageKey,image,@"inputIntensity", [NSNumber CIAttributeType = CIAttributeTypeImage; }; inputRadius = { CIAttributeClass = NSNumber CIAttributeFilterName = CIBumpDistortionLinear; inputAngle = { CIAttributeClass = NSNumber CIAttributeType = CIAttributeTypeImage; }; inputRadius = { CIAttributeClass = NSNumber CIAttributeType = CIAttributeTypeScalar; }; inputWidth = { CIAttributeClass = NSNumber
[NSNumber numberWithLong:477], [NSNumber numberWithLong:578], [NSNumber numberWithLong:798], [NSNumber numberWithLong:800], ], @[[NSNumber numberWithLong:100], [NSNumber [NSNumber numberWithLong:250], [NSNumber numberWithLong:350], [NSNumber numberWithLong:400], ], @[[NSNumber
例子 在接口中定义了一个实例变量 @interface Counter : NSObject { NSNumber *count; } 在实现中加入accessor方法 - (NSNumber *)count *zero = [NSNumber numberWithInt:0]; [self setCount:zero]; } 使用-alloc方法 - (void)reset { NSNumber *zero 没有使用accessor方法 - (void)reset { NSNumber *zero = [[NSNumber alloc] initWithInt:0]; [count release] 已经释放内存的变量再次调用release - (void)reset { NSNumber *zero = [NSNumber numberWithInt:0]; [self setCount:zero for (i = 0; i < 10; i++) { NSNumber *n = [[NSNumber alloc] initWithInt: i]; [array
在引入 Tagged Pointer 技术之前 NSNumber等对象存储在堆上,NSNumber的指针中存储的是堆中NSNumber对象的地址值。 从内存占用来看 基本数据类型所需的内存不大。 但总不能弃用NSNumber对象而改用基本数据类型吧。 从效率上来看 为了使用一个NSNumber对象,需要在堆上为其分配内存,还要维护它的引用计数,管理它的生命周期,实在是影响执行效率。 NSNumber等对象的指针中存储的数据变成了Tag+Data形式(Tag为特殊标记,用于区分NSNumber、NSDate、NSString等对象类型;Data为对象的值)。 { NSNumber *number1 = @1; NSNumber *number2 = @2; NSNumber *number3 = @3; *number1 = @(a); NSNumber *number2 = @(b); NSNumber *number3 = @(c); NSNumber
引言 get 和post 布尔值参数处理( 使用NSNumber 传BOOL值) 全局的const常量代替宏常量,节省内存空间。 敏感逻辑的保护: 把函数名隐藏在结构体里,以函数指针成员的形式存储。 而bool表示0是false,所以非0是true; 2.1 NSCFBoolean NSCFBoolean是NSNumber类簇中的一个私有的类,它是通往CFBooleanRef类型的桥梁。 NSLog(@"%@", [@(YES) class]); __NSCFBoolean 2.1 get 和post 布尔值参数处理( 使用NSNumber 传BOOL值) 使用NSNumber 传 @42,@3.14,@YES,@'Z':返回一个由相关类构造初始化的 NSNumber 对象 比如 @42 → [NSNumber numberWithInteger:42],或者 @YES → [NSNumber (比如,const char*返回NSString,int返回NSNumber。) 2.2 Objective-C 常量 选择器和协议可以作为方法参数。
*supportsPhoneCall; //是否支持导航 必须先设置经纬度信息 @property(nullable, strong) NSNumber *supportsNavigation; / , strong) NSNumber *bitsPerSample; //拍照时是否开启闪光灯 @property(nullable, strong, getter=isFlashOn) NSNumber *flashOn; //焦距是否35毫米 @property(nullable, strong, getter=isFocalLength35mm) NSNumber *focalLength35mm , strong) NSNumber *audioBitRate; //组织信息 @property(nullable, copy) NSArray<NSString*> *organizations; *altitude; //经度 @property(nullable, strong) NSNumber *latitude; //纬度 @property(nullable, strong) NSNumber
""" } func convertObjcNumberProperty() -> String { return """ @property(assign, nonatomic) NSNumber n" break case is Bool: dest = "@property(nonatomic, strong) NSArray<NSNumber \n" break case is Int: dest = "@property(nonatomic, strong) NSArray<NSNumber break case is Double: dest = "@property(nonatomic, strong) NSArray<NSNumber * height; @property(assign, nonatomic) NSNumber * age; @property(copy,nonatomic) Sub * sub; @property
pieChartView]; // 开始设值 NSDictionary *statistics = @{ @"初步接洽":[NSNumber numberWithLong:27], @"需求确定":[NSNumber numberWithLong:11], @"方案报价":[NSNumber numberWithLong:8], @"谈判审核":[NSNumber numberWithLong NSMutableArray *values = [NSMutableArray array]; //累加总数, 为了算百分比 double total = 0; for (NSNumber doubleValue]; } // 循环字典数组 创建data for (NSString *str in statistics.allKeys) { NSNumber
(value:0), NSNumber(value:1.0 / 6.0), NSNumber(value:3 / 6.0), NSNumber (value:5.0 / 6.0), NSNumber(value:1) ] animation.duration = 0.35 position.y" animation.values = [0, 10, 0, 5, 0] animation.keyTimes = [ NSNumber (value:0), NSNumber(value:1.0 / 6.0), NSNumber(value:3 / 6.0), NSNumber (value:5.0 / 6.0), NSNumber(value:1) ] animation.duration = 0.35
[OXDatePickerView alloc] initWithDefaultDate:1499040000 dateArray:[NSMutableArray arrayWithArray:@[[NSNumber numberWithLong: 1499040000], [NSNumber numberWithLong:1499522400], [NSNumber numberWithLong:1499123200 ], [NSNumber numberWithLong:1499020000], [NSNumber numberWithLong:1498816800], [NSNumber numberWithLong :1499162400], [NSNumber numberWithLong:1498744800]]]]; pickerView.delegate = self; [self.view stringWithFormat:@"入院日期:%ld", date]; } 用法很简单,初始化时需要传入两个参数,一个是默认一开始显示的日期时间,另一个是可供选择的时间戳的数组,注意时间戳是long型的,但是转化成了NSNumber
CABasicAnimation animationWithKeyPath:@"transform.rotation.y"]; rotationAnimation.toValue = [NSNumber 这种方式较好一些) CABasicAnimation *waitAnimation = [CABasicAnimation animation]; waitAnimation.toValue = [NSNumber CABasicAnimation animationWithKeyPath:@"transform.rotation.y"]; rotationAnimation.toValue = [NSNumber CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; //设置抖动幅度 shake.fromValue = [NSNumber numberWithFloat:-0.2]; shake.toValue = [NSNumber numberWithFloat:+0.2]; shake.duration = 0.1
timeArray, CGFloat totalTime, NSArray<NSNumber *>* widths, NSArray<NSNumber *>* heights))dataBlock{ //通过文件的url来将 numberWithFloat:width]]; [heightArray addObject:[NSNumber numberWithFloat:height]]; *> *timeArray, CGFloat totalTime, NSArray<NSNumber *> *widths, NSArray<NSNumber *> *heights) { //设置每一帧的时间占比 for (int i=0; i<imageArray.count; i++) { [times addObject:[NSNumber
文章目录 iOS Tagged Pointer 问题 原理 结构 NSNumber NSString 特点 测试 测试准备: NSNumber NSString 注意事项 isa指针 面试题 题1:执行以下两段代码 iOS Tagged Pointer 问题 如果要存一个NSNumber对象,其值是一个整数。 一部分直接保存数据,另一部分作为标记(这是一个特别的指针,不指向任何一个地址) (拿一个整数来说,4个字节所能表示的有符号整数就可达20 多亿,注:2^31=2147483648,另外 1 位作为符号位) 结构 NSNumber = 6, OBJC_TAG_RESERVED_7 = 7, ...... }; ---- 特点 专门用来存储小的对象,如:NSString、 NSNumber NSNumber *num0 = @1; NSNumber *num1 = @(0xffffffffffffff); // 14个f // 一共15位(1位4个bit),最高位Tag+类标志,最低位数据类型
addSubview:_barChartView]; // 开始设值 NSArray *statistics = @[ [NSNumber numberWithLong:5], [NSNumber numberWithLong:5], [NSNumber numberWithLong:7], [NSNumber numberWithLong:8], [NSNumber numberWithLong:8], [NSNumber numberWithLong:10], leftAxisMin = 0; double leftAxisMax = 0; for (int i = 0; i < statistics.count; i++) { NSNumber