Objective-C(十、NSRange,point,size,rect,NSNumber,NSValue,NSNull)——iOS开发基础


结合之前的学习笔记以及参考《Objective-C编程全解(第三版)》,对Objective-C知识点进行梳理总结。知识点一直在变,只是作为参考,以苹果官方文档为准~


十、常用的类
NSRange,NS/CGPoint,NS/CGSize,NS/CGRect,NSNumber,NSValue,NSNull


1、NSRange
(1)定义

typedef struct _NSRange {
     NSUInteger location;
     NSUInteger length;
 } NSRange;

(2)创建

 NSRange range = {2, 18};
 NSRange range1 = {.location = 1, .length = 18};
 NSRange range2 = NSMakeRange(2, 18); //最常用

(3)查找

 NSString *str = @"Hello world!";
 //查找@"Hello"的范围
 NSRange r = [str rangeOfString:@"Hello"];   
 //打印出来是{0,5}
 //    NSRange r = [str rangeOfString:@"Hi"];
 if (r.location == NSNotFound) {
  //当查找不到时,location==NSNotFound,length==0
     NSLog(@"不含Hello字符串");
 }
 else {
     //r.location,r.length
     NSLog(@"%@",NSStringFromRange(r)); //Range转换为NSString打印
 }

2、NSPoint/CGPoint(点)
(1)两者异同:CGPoint是属于#include
两者使用起来无区别,但CG框架是跨平台的(跨平台既可以在移动端iOS平台开发使用,也可以在Max的OS X平台开发使用),而Foundation框架不是跨平台的,因此较常使用CGPoint
(2)定义:

 struct CGPoint {
     CGFloat x;
     CGFloat y;
 };
 typedef struct CGPoint CGPoint;

(3)创建

 NSPoint p1 = NSMakePoint(2, 18);
 CGPoint p2 = NSMakePoint(2, 18);
 NSLog(@"%@",NSStringFromPoint(p1));
 NSLog(@"%@",NSStringFromPoint(p2));

output:

    {2, 18}
    {2, 18}

3、NSSize/CGSize(尺寸)
(1)定义

 struct CGSize {
     CGFloat width;
     CGFloat height;
 };
 typedef struct CGSize CGSize;

(2)创建

 CGSize s1 = CGSizeMake(2, 18);
 NSLog(@"%@", NSStringFromSize(s1));

output:

     {2, 18}

4、NSRect/CGRect(一个UI元素)
(1)定义

 struct CGRect {
     CGPoint origin;
     CGSize size;
 };
 typedef struct CGRect CGRect;

(2)创建

 CGRect r1 = CGRectMake(0, 0, 100, 100);
 CGRect r2 = {p1,s1};
 CGRect r3 = {CGPointZero,CGSizeMake(100, 100)};
 NSLog(@"%@",NSStringFromRect(r1));

output:

 {{0, 0}, {100, 100}}

!注意:UI界面的原点在左上角


5、NSNumber
Cocoa Foundation框架的集合类(NSArray、NSDictionary和NSSet)只可存放OC对象,不能存基本类型数据,因此Cocoa提供了NSNumber类来包装char、int、long等基本类型的数据,使其能够被放入类似NSArray或NSDictionary的集合中。
(1)基本类型数据包装成OC对象(便利构造器)

 @interface NSNumber (NSNumberCreation)

 + (NSNumber *)numberWithChar:(char)value;                      //char
 + (NSNumber *)numberWithUnsignedChar:(unsigned char)value;     //unsigned char
 + (NSNumber *)numberWithShort:(short)value;                    //short
 + (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
 + (NSNumber *)numberWithInt:(int)value;
 + (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
 + (NSNumber *)numberWithLong:(long)value;
 + (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
 + (NSNumber *)numberWithLongLong:(long long)value;
 + (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
 + (NSNumber *)numberWithFloat:(float)value;
 + (NSNumber *)numberWithDouble:(double)value;
 + (NSNumber *)numberWithBool:(BOOL)value;
 + (NSNumber *)numberWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0);
 + (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0);

 @end

Example:

NSNumber *num = [NSNumber numberWithInt:20];

初始化方法与上同理:举一例说明

 - (NSNumber *)initWithChar:(char)value;

(2)NSNumber转换为基本数据类型(不繁琐列举,基本都是基本数据类型+Value)

 - (char)charValue;
 - (Bool)boolValue;

(3)其他

 - (BOOL)isEqualToNumber:(NSNumber *)number;    
  //判断两个NSNumber对象是否相等
 - (NSString *)stringValue;                    
  //返回NSNumber的字符串表示形式

(4)对于基本类型变量,可以以@(XXX)的形式直接转化
@和()不能少,不加@编译器会以为是一个关键字

int age = 10;
NSLog(@"%@", @(age));

直接在基本类型数据前加@就可以把它包装成一个OC对象

    NSArray *array = @[@1,@2];

6、NSValue
像结构体、指针这些复杂的数据类型,NSNumber无法将他们存储为对象,这是就可以使用NSValue;
NSValue是NSNumber的父类!
NSValue可以将任意类型包装成对象
(1)NSValue装箱和拆箱方法

数据类型 包装 获取
指针 + valueWithPointer: - pointerValue
NSPoint + valueWithPoint: - pointValue
NSRect + valueWithRect: - rectValue
NSSize + valueWithSize: - sizeValue
NSRange + valueWithRange: - rangeValue

(2)其他

- (BOOL)isEqualToValue:(NSValue *)value;       
 //判断两对象是否相同

7、NSNull
不能再数组和词典对象中存入nil,因为nil有特殊含义。因此使用NSNull来表示空值;
(1)定义

 + (NSNull *)null;      //返回一个NSNull的实例对象,是一个常量,不能release释放。NSNull的description会返回字符串<null>

(2)判断是否为NSNull

if (obj == [NSNull null]) {
     NSLog(@"这一对象是NSNull");
}

你可能感兴趣的:(Objective-C)