这里写目录标题
前言
Objective- C提供了NSValue、NSNumber来封装c语言的基本类型,这样就可以让他们具有面向对象的特征
三个类型
NSInteger
:大致等于long型整数NSUInteger
:大致等于unsigned long 型整数CGFLoat
:大致相当于double( 在64位系统),float(在32位系统)
注意:它们是基本类型不是包装类。在定义整形变量时建议使用NSInteger,NSUInteger,定义浮点型变量时建议使用CGFLoat
包装类
NSValue 和 NSNumber
1、相同点
NSValue 和 NSNumber都是包装类,NSValue 是 NSNumber的父类
2、区别
NSValue:代表一个更通用的包装类,可用于包装单个short、int、long、float、char、指针、对象id等数据项
NSNumbe:是更具体的包装类,用于包装c语言的各种数值类型
NSNumber 方法 :
- + numberWithXxx : : 将特定类型的值包装成 NSNumber;
- - initWithXxx : :先创建一个 NSNumber 对象, 再用一个基本类型的值来初始化 NSNumber;
- - xxxValue : : 返回 NSNumber 对象包装的基本类型的值;
包装类代码示例
#import <Foundation/Foundation.h>
int main(int argc, char * argv[]) {
@autoreleasepool {
NSNumber * num_int = [NSNumber numberWithInt : 10];
NSNumber * num_double = [NSNumber numberWithDouble : 10];
NSNumber * num_char = [NSNumber numberWithChar : 'A'];
NSLog(@"number_int : %d, number_double : %g, num_char : %c",
[num_int intValue], [num_double doubleValue], [num_char charValue]);
NSNumber * num_int1 = [[NSNumber alloc] initWithInt : 10];
NSNumber * num_double1 = [[NSNumber alloc] initWithDouble : 10];
NSNumber * num_char1 = [[NSNumber alloc] initWithChar : 'A'];
NSLog(@"number_int1 : %d, number_double1 : %g, num_char1 : %c",
[num_int1 intValue], [num_double1 doubleValue], [num_char1 charValue]);
}
}
运行结果
description 方法
1.description 方法简介
是一个“自我描述”方法,用以告诉外界该对象具有的状态信息
- 方法来源 : description 是 NSObject 中定义的, 所有的Objective—C对象都有该方法;
- 默认方法 : description 默认方法返回 <类名: 地址>;
- 输出对象 : NSLog() 函数输出一个对象, 其实输出的是该对象的 description 方法;
2. 重写description
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface FKApple : NSObject
@property (nonatomic, copy) NSString* color;
@property (nonatomic, assign) double weight;
- (id)initWithColor:(NSString* )color weight:(double)weight;
@end
NS_ASSUME_NONNULL_END
#import "FKApple.h"
@implementation FKApple
- (id)initWithColor:(NSString* )color weight:(double)weight {
if(self = [super init]) {
self.color = color;
self.weight = weight;
}
return self ;
}
-(NSString*)description {
return [NSString stringWithFormat:@"<FKApple[_color=%@,_weight=%g]>",self.color,self.weight];
}
@end
#import <Foundation/Foundation.h>
#import "FKApple.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
FKApple* p=[[FKApple alloc] initWithColor:@"红色" weight:5.68];
NSLog(@"%@",p);
}
return 0;
}
运行结果
== 或 isEqual : 方法
(1) “==” 运算符
“==” 简介 :
– 作用 : 是地址比较
简单比较了俩个基本类型的值是否相同,不要求数据类型严格相同,1.0与1做比较返回1
当用==比较俩个指针类型的变量,他俩必须指向同一对象,指针保存的是地址,本质上比较的是地址是否一致
– 前提 : 两个变量都是基本类型, 两个变量相等返回 true; 指针类型变量比较地址没有任何意义;
运行结果
可以看到输出 1 0 1 0,最后一句话还会编译警告,因为NSData不是NSSting 的子类,没有继承关系。
isEqual的重写
- 在NSObject中,默认isEqual与==是毫无差别的,对于指针的比较,也是比较地址是否一致,但在NSString中,已经改写了isEqual,他比较的每个字符是否相同。
- 我们想让isEqual比较其他的东西,就需要对他进行改写。
定一个类
#import <Foundation/Foundation.h>
@interface FKUser :NSObject
@property(nonatomic, copy) NSString * name;
@property(nonatomic, copy) NSString * idStr;
- (id) initWithName : (NSString *) name idStr :(NSString *) idStr;
@end
#import "FKUser.h"
@implementation FKUser
-(id) initWithName:(NSString *)name idStr: (NSString *)idStr {
if (self = [super init]) {
self.name = name;
self.idStr = idStr;
}
return self;
}
-(BOOL) isEqual: (id)other {
if (self == other) {
return YES;
}
// other 是FKUser的实例
if (other != nil &&[other isMemberOfClass:FKUser.class]){ FKUser * target = (FKUser *)other;
return [self.idStr isEqual: target.idStr];
}
return NO;
}
@end
#import "FKUser.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
FKUser *p1 = [[FKUser alloc] initWithName: @"s1" idStr: @"123456"];
FKUser *p2 = [[FKUser alloc] initWithName: @"s2" idStr: @"123456"];
FKUser *p3 = [[FKUser alloc] initWithName: @"s3" idStr: @"111111"];
NSLog(@"%d", [p1 isEqual: p2]);
NSLog(@"%d", [p2 isEqual: p3]);
}
}
运行结果