oc——的包装类
oc中提供了NSvalue,NSNumber来封装C语言的基本类型,这样就可以让它们具有面向对象的特征。
在进行iOS开发时,可能会遇到如下三个类型
🎇NSInteger: 大致等于long型整数
🎇NSUInteger: 大致等于unsigned long型整数
🎇CGFLoat: 在64位平台上大致相当于double,在32位平台大致相当于float
NSValue和NSNumber
NSValue和NSNumber都是包装类,其中NSValue是NSNumber的父类,NSValue代表一个更通用的包装类,它可用于包装多个short ,int,long,float,char指针,对象id等数据项,通过该包装类,就可以把short,int,long,float,char,指针等添加到NSArray,NSSet等集合中。
NSNumber是更具体的包装类,主要用于包装C语言的各种数值类型,NSNumber主要包括如下三类方法:
🎇+numberWithXxx: 该类方法直接将特定类型的值包装成NSNumber
🎇-initWithXxx: 该实例方法需要先创建一个NSNumber对象,再用一个基本类型的值来初始化NSNumber
🎇-xxxValue: 该实例方法返回该NSNumber对象包装的基本类型的值
下面程序示范了基本类型的值与包装类之间的转换:
#import <Foundation/Foundation.h>
int main(int argc, char * argv[]) {
@autoreleasepool {
//调用类方法将int类型的值包装成NSNumber对象
NSNumber * num = [NSNumber numberWithInt:20];
//调用类方法将double类型的值包装成NSNumber对象
NSNumber * de = [NSNumber numberWithDouble: 3.4];
NSLog(@"%d",[num intValue]);
NSLog(@"%g",[de doubleValue]);
//先创建NSNumber对象,再调用initWithXxx方法执行初始化
NSNumber * ch = [[NSNumber alloc]initWithChar:'J'];
//直接输出NSNumber对象,使用%@方法
NSLog(@"%@",ch);
}
}
oc——处理对象
1.description方法
description方法是NSObject类的一个实例方法,所有的Objective-c类都是NSObject类的子类,因此,所有的oc对象都有一个description方法。
description方法是一个非常特殊的方法,它是一个“自我描述”方法,该方法通常用于实现这样一个功能:当程序员直接打印对象的时候,系统将会输出该对象的“自我描述”信息,用以告诉外界该对象具有的状态信息。
我们来看一串代码:
#import <Foundation/Foundation.h>
#import "FKPerson.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
FKPerson * p = [FKPerson new];
NSLog(@"%@",p);
NSLog(@"%@",[p description]);
}
}
我们不需要去管FKPerson这个类,我们来看代码的输出结果:
两个输出方式输出的值完全相同
大部分时候,重写description方法总是返回该对象所有令人感兴趣的信息所组成的字符串,我们来看下面的代码:
// FKApple.h
#import <Foundation/Foundation.h>
@interface FKApple : NSObject
@property (nonatomic , copy) NSString * color;
@property (nonatomic , assign) double weight;
- (id) initWithColor: (NSString * ) color weight: (double) weight;
- (NSString * ) description2 ;
@end
// FKApple.m
#import "FKApple.h"
@implementation FKApple
- (id) initWithColor:(NSString * )color weight:(double)weight {
if(self = [super init]) {
self.color = color;
self.weight = weight;
}
return self;
}
//重写父类的description方法
- (NSString * ) description2 {
//返回一个字符串
return [NSString stringWithFormat:@"<FKApple[_color=%@,_weight=%g]>",self.color,self.weight];
}
@end
// main.m
#import "FKApple.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
FKApple * a = [[FKApple alloc] initWithColor: @"red" weight: 8.6];
NSLog(@"%@", [a description2]);
NSLog(@"%@", [a description]);
}
return 0;
}
从上面的运行结果可以看出,通过重写FKApple类的description方法,就可以让系统在打印FKApple对象时打印出该对象的“自我描述”信息。
2.==和isEqual方法
== 主要是比较两个内存地址是否相同。
isEqual是比较两个数据对应点hash值(把二进制数据转化成固定比较小的值 int)是否相同。
什么意思呢,我们来看下面代码:
#import <Foundation/Foundation.h>
int main(int argc, char * argv[]) {
@autoreleasepool {
NSString * a = @"123";
NSString * b = @"123";
NSLog(@"%d",(a == b));
NSLog(@"%d",[a isEqual : b]);
NSString * c = @"123";
NSString * d = [NSString stringWithFormat:@"123"];
NSLog(@"%d",(c == d));
NSLog(@"%d",[c isEqual : d]);
}
}
运行结果:
使用NSString stringWithFormat:类方法创建的字符串对象是运行时创建出来的,它被保存在运行时内存区内(即堆内存),不会放入常量池中,因此,程序中的s3指针变量中保存的地址与s1,s2指针变量中保存的地址并不相同。