结合之前的学习笔记以及参考《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 <CoreGraphics/CGBase.h>
两者使用起来无区别,但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");
}