oc——的包装类 & oc——处理对象

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指针变量中保存的地址并不相同。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值