OC中的数据类型 | 青训营笔记

141 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第1天

OC中的数据类型

在讲数据类型之前,首先介绍一下NSObject类,毕竟所有的类都继承自这个类。

NSObject类-简介

  • NSObject遵守NSObject协议。
  • NSObject类是所有类的根类,所有的类都继承自NSObject类,并拥有NSObject类中的方法。常见的方法有分配内存空间alloc和初始化init方法,我们在创建任何对象时,都会用到这两个方法(当然也可以使用new来代替alloc+init)。

NSObject类-消息机制

通过performSelector调用方法,如果方法不存在,在编译时也不会出现报错,所以一般在使用前先通过respondsToSelector方法确认该对象是否响应消息,如果返回true,才继续通过performSelector方法调用,否则会导致程序崩溃。

常见使用perforSelector的情况:

  • 在Runtime时动态添加进来的方法,在编译时不存在。
  • 该对象有私有方法,但没有在interface中声明。

NSString字符串

NSString在OC中最常用于处理字符串,下面主要记录了NSString中最常用的一些方法,方便在后期学习过程中回顾:

创建方法:

// 初始化一个空字符串
NSString *stringObject2 = [[NSString alloc] init];
// 初始化一个字符串
NSString *stringObject3 = [NSString stringWithString:@"hello"];
// 拼接一个字符串
NSString *stringObject4 = [stringObject3 stringByAppendingString:@" world"];

类型转换:

NSString *numberStr = @"123"; 
// BOOL 
BOOL boolValue = [numberStr boolValue]; 
// int 
int intValue = [numberStr intValue]; 
//float 
float floatValue = [testStr floatValue]; 
// double 
double doubleValue = [testStr doubleValue];

获取子字符串方法:

// 获取字符串的长度
NSUInteger length = [stringObject5 length];
// 获取索引下标的字符
unichar index_char = [stringObject5 characterAtIndex:0];

// 截取字符串,从索引位置到结尾
NSString *subStr1 = [stringObject5 substringFromIndex:1];
// 截取字符串,从开始到索引位置
NSString *subStr2 = [stringObject5 substringToIndex:3];
// 截取字符串,从索引开始,取长度个数组成的字符串
NSRange range = NSMakeRange(1, 2);
NSString *subStr3 = [stringObject5 substringWithRange:range];

NSArray数组

  • NSArray不像C语言中的数组,NSArray中的数组可以存储不同Class对应的对象。
  • NSArray中存放的每一项不管是什么类的对象都是等长的。
  • NSArray中不可以存放int,float,bool等基本类型,这些基本类型在OC中可以用对象NSNumber表示。

常用方法:

NSString *str = @"bytedance";
NSArray *array = @[str, @"iOS", @"Android"];

// count  数组中所含元素个数
NSLog(@"count = %d", array.count);
// 返回对应位置对象
NSObject *obj1 = array[0]
// 返回元素对应位置(认对象)
NSUInteger index = [array indexOfObject:obj1];
// lastObject  返回数组最后一个元素
NSObject *obj2 = [array lastObject];

// containsObject   是否包含指定对象
if ([array containsObject:str]) {
    // true
}
if ([array containsObject:@"iOS"]) {
    // true
}

//使用for循环遍历
for (NSString *strObj in array) {
    NSLog(@"%@", strObj);
}

值得注意的是,NSArray为不可变数组,只可以读取不能修改,如果需要增删改查,需要使用NSMutableArray。两者的主要差异如下:

  • NSArray不会修改对象,线程安全,查找性能好,通常用于属性声明或是方法参数/回传值
  • NSMutableArray可能会修改对象,线程不安全,查找性能较差,所以一般用于临时变量。

NSDictionary字典

NSDictionary通过键值存储和方法,通过key来访问对应的value。 可以使用key下标直接访问或是通过objectForKey方法访问,返回id类型,指可以返回任意类型,所以在取出的时候我们都要判断一下取出的类型是否是我们期望的类型,例如在运算时,类型不一致则会导致崩溃。 同样,NSDictionary也是不可变的,需要增删改查时也需要使用其对应的可变对象NSMutableDictionary。

总结

可以看到这些数据类型中有许多的方法,我觉得没有必要去硬记,在之后的学习过程中,有需要用到什么方法就去查找对应的方法,慢慢地就会对这些方法越来越熟悉。