003-Foundation框架

第一部分:字符串

一、NSString(不可变字符串)

  1.创建字符串   

 1     // @创建
 2     NSString *str1 = @"abcdef.com.10588423@qq.com";
 3     // new(类方法)创建
 4     NSString *str2 = [NSString new];
 5     // alloc init创建
 6     NSString *str3 = [[NSString alloc] init];
 7     NSString *str4 = [[NSString alloc] initWithFormat:@"%@%@", str1, str2];
 8     NSString *str5 = [[NSString alloc] initWithCString:"abcd"];  // C的字符串 --> OC的字符串
 9     // 其他对象转化字符串
10     NSString *str6 = NSStringFromClass([NSObject class]); // 类名 --> 字符串

  2.字符串的操作

 1     // 获取字符串的长度
 2     NSUInteger *length1 = [str1 length];
 3     NSUInteger *length2 = str1.length;
 4     // 根据索引获取单个字符
 5     unichar ch = [str1 characterAtIndex:0];
 6     // 根据索引获取子串(截取)
 7     NSString *subStr1 = [str1 substringFromIndex:3]; // [index, 末尾]
 8     NSString *subStr2 = [str1 substringToIndex:4]; // [开头, index)
 9     NSString *subStr3 = [str1 substringWithRange:NSMakeRange(2, 5)]; // 从index开始,截length个长度
10     // 获取子串在父串中的索引位置
11     NSRange range1 = [str1 rangeOfString:subStr1]; // 正向查找
12     if (range1.location != NSNotFound) {
13         NSLog(@"location = %ld, length = %ld", range1.location, range1.length);
14     }
15     NSRange range2 = [str1 rangeOfString:subStr1 options:NSBackwardsSearch]; // 反向查找

  3.字符串的判断

 1     // 判断字符串是否为空
 2     if (str1 == nil || str1.length == 0) {
 3         NSLog(@"字符串是否为空");
 4     }
 5     // 判断字符串的前缀
 6     if ([str1 hasPrefix:@"www"]) {
 7         NSLog(@"str1以www开头");
 8     }
 9     // 判断字符串的后缀
10     if ([str1 hasSuffix:@".edu"]) {
11         NSLog(@"str1以.edu结尾");
12     }
13     // 判断两个字符串是否相等
14     if ([str1 isEqualToString:str2]) {
15         NSLog(@"str1 = str2");
16     }
17     // 比较字符串的大小(逐个比较字符串中各字符的ASSIC码)
18     NSComparisonResult result = [str1 compare:str2];
19     if (result == -1) {
20         NSLog(@"str1 < str2");
21     } else if (result == 0) {
22         NSLog(@"str1 = str2");
23     } else if (result == 1) {
24         NSLog(@"str1 > str2");
25     }

  4.不同类型间的转化

 1     // 基本数据类型 --> 字符串
 2     // 基本数据类型(int、folat、double、char)
 3     int a = 10;
 4     float b = 10.01;
 5     double c = 10.0009;
 6     char d = 'A';  // unichar --> 用%C  char --> 用%c
 7     NSString *string1 = [NSString stringWithFormat:@"%d", a];  // int --> NSString
 8     NSString *string2 = [NSString stringWithFormat:@"%.2f", b]; // float --> NSString
 9     NSString *string3 = [NSString stringWithFormat:@"%.4f", c]; // double --> NSString
10     NSString *string4 = [NSString stringWithFormat:@"%c", d]; // char --> NSString
11     // 字符串 --> 基本数据类型
12     int i1 = [string1 intValue]; // NSString --> int
13     float i2 = [string2 floatValue]; // NSString --> float
14     double i3 = [string3 doubleValue]; // NSString --> double
15     unichar i4 = [string4 characterAtIndex:0]; // 取字符

  5.字符串大小写转换

1     NSString *tmpStr1 = [str1 uppercaseString]; // 小写 --> 大写
2     NSString *tmpStr2 = [str1 lowercaseString]; // 大写 --> 小写
3     NSString *tmpStr3 = [str1 capitalizedString]; // 首字母大写

  6.字符串重组 -- (这里面的重组都会重新创建生成新的字符串)

 1     // 重组字符串
 2     int year = 1990;
 3     int month = 9;
 4     int day = 8;
 5     NSString *date = [NSString stringWithFormat:@"%d-0%d-0%d", year, month, day];
 6     // 拼接字符
 7     NSString *s1 = [date stringByAppendingString:@"com"]; // 追加"com"
 8     NSString *s2 = [date stringByAppendingPathComponent:@"com"]; // 追加"/com"
 9     NSString *s3 = [date stringByReplacingCharactersInRange:NSMakeRange(2, 3) withString:@"abcd"]; // 在index下标处插入,覆盖后面length个字符
10     // 字符替换
11     NSString *s4 = [date stringByReplacingOccurrencesOfString:@"-" withString:@" "]; // 将"-"换成" "

  7.字符串操作文件

 1     NSString *writeContent = @"1949年10月1日,中华人民共和国成立啦!";
 2     NSString *path = @"/User/apple/Desktop/myTest.txt";  // 文件路径
 3     // 保存文件,写文件
 4     NSError *writeError = nil;
 5     BOOL isWriteSuccess = [writeContent writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&writeError];
 6     if (isWriteSuccess) {
 7         NSLog(@"文件写入成功");
 8     } else {
 9         NSLog(@"writeError = %@", writeError);
10     }
11     // 读取文件
12     NSError *readError = nil;
13     NSString *readContent = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&readError];
14     if (readError == nil) {
15         NSLog(@"readContent = %@", readContent);
16     } else {
17         NSLog(@"readError = %@", readError);
18     }

 

二、NSMutableString(可变字符串)

 1     // 1.创建
 2     NSMutableString *muStr1 = [[NSMutableString alloc] init];
 3     NSMutableString *muStr2 = [[NSMutableString alloc] initWithCapacity:0]; // 字符串长度为0,但是可变
 4     NSMutableString *muStr3 = [NSMutableString string];
 5     
 6     // 2.设置字符串的内容(重置)
 7     [muStr2 setString:@"abcdefg"];
 8     
 9     // 3.可变字符串的操作(这些不会重新创建新的字符串)
10     // 追加
11     [muStr1 appendString:@"wer"];
12     [muStr1 appendFormat:@"%@", muStr2];
13     // 插入
14     [muStr1 insertString:@"werrtyuirtyu" atIndex:3]; // 在index下标处插入
15     // 删除
16     [muStr1 deleteCharactersInRange:NSMakeRange(2, 4)]; // 从index处开始删除length个长度字符
17     // 替换
18     [muStr1 replaceCharactersInRange:NSMakeRange(2, 4) withString:@"Frank"]; // 将index处开始到length个长度的字符换成"Frank"

 

 

第二部分:NSNumber(基本数据类型包装类)

 1     // 1.包装基本数据类型
 2     int a1 = 12;
 3     float a2 = 13.23;
 4     BOOL a3 = YES;
 5     char a4 = 'A';
 6     double a5 = 12.0002;
 7     NSInteger a6 = 19;
 8     NSNumber *num1 = [NSNumber numberWithInt:a1];
 9     NSNumber *num2 = [NSNumber numberWithFloat:a2];
10     NSNumber *num3 = [NSNumber numberWithBool:a3];
11     NSNumber *num4 = [NSNumber numberWithChar:a4];
12     NSNumber *num5 = [NSNumber numberWithDouble:a5];
13     NSNumber *num6 = [NSNumber numberWithInteger:a6];
14     
15     // 2.NSNumber ---> NSString
16     NSString *nunString = [num1 stringValue];
17     
18     // 3.NSNumber ---> 基本数据类型
19     int b1 = [num1 intValue];
20     float b2 = [num2 floatValue];
21     BOOL b3 = [num3 boolValue];
22     char b4 = [num4 charValue];
23     double b5 = [num5 doubleValue];
24     NSInteger b6 = [num6 integerValue];

 

 

第三部分:数组

一、NSArray(不可变数组)

  1.数组的创建

 1     // 1)对象方法
 2     NSArray *array1 = [[NSArray alloc] init];
 3     NSArray *array2 = [[NSArray alloc] initWithArray:array1];
 4     NSArray *array3 = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];
 5     // 2)类方法
 6     NSArray *array4 = [NSArray array];
 7     NSArray *array5 = [NSArray arrayWithArray:array1];
 8     NSArray *array6 = [NSArray arrayWithObjects:@"one", @"two", @"three", nil];
 9     // 3)最快捷的方法
10     NSArray *array7 = @[@"lidong", @"li", @"dong"];

  总结:

      1)数组只能存放对象类型,并且存放该对象对象的地址

      2)数组如果需要存放基本数据类型,必须先将基本数据类型包装起来

      3)在利用数组初始化方法给数组赋值时,必须以nil为结束标志符;这也就说明,如果数组中间存入对象为nil时,会造成数据丢失

  2.从数组中取元素

 1     NSArray *arr1 = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];
 2     // 1)下标法
 3     NSString *str0 = arr1[0];
 4     // 2)通过方法取
 5     NSString *str1 = [arr1 objectAtIndex:1];
 6     // 3)取首元素
 7     NSString *str3 = [arr1 firstObject];
 8     // 4)取最后一个元素
 9     NSString *str4 = [arr1 lastObject];
10     // 5)从数组中提取部分元素
11     NSArray *subArr1 = [arr1 subarrayWithRange:NSMakeRange(0, 2)];
12     // 6)根据下标集合取出部分元素
13     NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet];
14     [indexes addIndex:0];
15     [indexes addIndex:2];
16     NSArray *subArr2 = [arr1 objectsAtIndexes:indexes];
17     // 7)通过数组中的元素获取下标
18     NSUInteger index = [arr1 indexOfObject:@"one"];

  3.获取数组中元素个数

1     NSArray *arr2 = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];
2     NSUInteger count1 = [arr2 count];
3     NSUInteger count2 = arr2.count;

  4.判断数组中是否存在某个对象

1     NSArray *arr3 = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];
2     BOOL isContain = [arr3 containsObject:@"one"];

  5.循环遍历数组

 1     NSArray *dataArray = @[@"I", @"am", @"a", @"student"];
 2     // 1)下标法
 3     for (int i = 0; i < dataArray.count; i++) {
 4         NSString *sonString = dataArray[i];
 5         NSLog(@"sonString = %@", sonString);
 6     }
 7     // 2)枚举器法
 8     // a.正向遍历
 9     NSEnumerator *enumerator1 = [dataArray objectEnumerator]; // 数组生成正向枚举器
10     id obj1 = nil;  // 因为不清楚数组里存放的是什么类型的对象,所以只能使用泛型指针接收
11     while (obj1 = [enumerator1 nextObject]) {
12         NSLog(@"obj1 = %@", obj1);
13     }
14     // b.反向遍历
15     NSEnumerator *enumerator2 = [dataArray reverseObjectEnumerator]; // 数组生成反向枚举器
16     id obj2 = nil;
17     while (obj2 = [enumerator2 nextObject]) {
18         NSLog(@"obj2 = %@", obj2);
19     }
20     // 3)快速枚举法
21     for (id obj3 in dataArray) {
22         NSLog(@"obj3 = %@", obj3);
23     }

  6.数组排序

 1     // 1)使用sortedArrayUsingSelector
 2     // 升序排列
 3     NSArray *dataArray1 = @[@"b", @"a", @"e", @"w", @"p"];
 4     dataArray1 = [dataArray1 sortedArrayUsingSelector:@selector(compare:)];
 5     NSLog(@"排序后:%@", dataArray1);
 6     
 7     // 2)使用block
 8     NSArray *dataArray2 = @[@"4", @"a", @"9", @"w", @"p"];
 9     // 升序
10     dataArray2 = [dataArray2 sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
11         return [obj1 compare:obj2];
12     }];
13     NSLog(@"升序排列后:%@", dataArray2);
14     // 降序
15     dataArray2 = [dataArray2 sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
16         return [obj2 compare:obj1];
17     }];
18     NSLog(@"降序排列后:%@", dataArray2);
19     
20     // 3)对自定义对象进行排序
21     Student *xiaoguan = [[Student alloc] initWithName:@"fuguanlin" andAge:13 andYear:@"2002"];
22     Student *xiaodian = [[Student alloc] initWithName:@"zhangdian" andAge:14 andYear:@"2001"];
23     Student *xiaosong = [[Student alloc] initWithName:@"mengjingsong" andAge:12 andYear:@"2003"];
24     Student *xiaosu = [[Student alloc] initWithName:@"suyifan" andAge:13 andYear:@"2003"];
25     Student *xiaohao = [[Student alloc] initWithName:@"qiyuhao" andAge:10 andYear:@"2005"];
26     // a.按照某一个字段或是某几个字段排序
27     NSArray *dataArray3 = @[xiaoguan, xiaodian, xiaosong, xiaosu, xiaohao];
28     NSSortDescriptor *descriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES]; // 按照age升序
29     NSSortDescriptor *descriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"year" ascending:NO];  // 按照year降序
30     dataArray3 = [dataArray3 sortedArrayUsingDescriptors:@[descriptor1, descriptor2]];
31     NSLog(@"按照age升序,year降序排列后:%@", dataArray3);
32     // b.按照某一个字段排序
33     NSArray *dataArray4 = @[xiaoguan, xiaodian, xiaosong, xiaosu, xiaohao];
34     dataArray4 = [dataArray4 sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
35         Student *student1 = obj1;
36         Student *student2 = obj2;
37         return [student1.year compare:student2.year]; // 字符串的方法
38     }];
39     NSLog(@"按照year升序排列后:%@", dataArray3);

 

二、NSMutableArray(可变数组)

   1.数组的创建

1     // 1)对象方法
2     NSMutableArray *array1 = [[NSMutableArray alloc] initWithCapacity:0];
3     NSMutableArray *array2 = [[NSMutableArray alloc] initWithArray:array1];
4     NSMutableArray *array3 = [[NSMutableArray alloc] initWithObjects:@"baocun", @"jingai", @"lid", @"zhangxi", nil]; 
5     // 2)类方法
6     NSMutableArray *array4 = [NSMutableArray array];
7     NSMutableArray *array5 = [NSMutableArray arrayWithArray:array1];
8     NSMutableArray *array6 = [NSMutableArray arrayWithCapacity:0];
9     NSMutableArray *array7 = [NSMutableArray arrayWithObjects:@"baocun", @"jingai", @"lid", @"zhangxi", nil];

  2.可变数组的常用方法 --- 增删改

 1     NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:@"baocun", @"jingai", @"lid", @"zhangxi", @"a1", @"jianjun", nil];
 2     NSArray *array = @[@"liujie", @"luoyi", @"lvhui"];
 3     NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet];
 4     [indexes addIndex:0];
 5     [indexes addIndex:2];
 6     [indexes addIndex:3];
 7     
 8     // 1)增
 9     // 追加
10     [dataArray addObject:@"a2"];  // 追加一个元素
11     [dataArray addObjectsFromArray:array]; // 追加一个数组的内容
12     // 插入
13     [dataArray insertObject:@"xxx" atIndex:0]; // 在指定下标插入指定元素
14     [dataArray insertObjects:array atIndexes:indexes]; // 在指定下标集处插入指定数组元素
15     
16     // 2)删
17     // 删除指定元素(删除该数组中所有相同的指定元素)
18     [dataArray removeObject:@"xxx"];
19     // 通过下标删除元素
20     [dataArray removeObjectAtIndex:0];
21     // 删除最后一个元素
22     [dataArray removeLastObject];
23     // 删除所有
24     [dataArray removeAllObjects];
25     // 删除某一范围内的元素
26     [dataArray removeObjectsInRange:NSMakeRange(2, 2)];
27     // 删除某一下标集合所对应的元素
28     [dataArray removeObjectsAtIndexes:indexes];
29     // 删除参考数组里的元素(删除两个数组里边共同元素)
30     [dataArray removeObjectsInArray:array];
31     
32     // 3)改
33     // 替换指定下标处的元素
34     [dataArray replaceObjectAtIndex:0 withObject:@"aaaa"];
35     // 替换下标集所对应的所有元素
36     [dataArray replaceObjectsAtIndexes:indexes withObjects:array];
37     // 替换某一范围内的所有元素为指定数组的元素
38     [dataArray replaceObjectsInRange:NSMakeRange(0, 3) withObjectsFromArray:array];
39     // 替换某一范围内的所有元素为指定数组的指定范围内元素
40     [dataArray replaceObjectsInRange:NSMakeRange(0, 2) withObjectsFromArray:array range:NSMakeRange(1, 2)];
41     // 两元素对调
42     [dataArray exchangeObjectAtIndex:0 withObjectAtIndex:dataArray.count - 1];

  3.数组与字符串

 1     // 1)字符串分割 ---> 数组
 2     // 这里分割不会改变远字符串的值,而是重新创建一个新的字符串
 3     NSString *str1 = @"I #am a #student";
 4     // a.以空格和#组成的字符串去分割
 5     NSArray *arr1 = [str1 componentsSeparatedByString:@" #"];
 6     // b.以字符集合中的字符去分割
 7     // 以字符集合里的每一字符作为分隔符
 8     // 若当前分隔符的下一字符也是分隔符时,产生空串(如果有两个分隔符连在一起就会产生空串)
 9     NSCharacterSet *charcaterSet = [NSCharacterSet characterSetWithCharactersInString:@" #"];
10     NSArray *arr2 = [str1 componentsSeparatedByCharactersInSet:charcaterSet];
11     
12     // 2)数组拼接 ----> 字符串
13     NSArray *arr3 = @[@"I", @"am", @"a", @"student"];
14     NSString *str2 = [arr3 componentsJoinedByString:@" "]; // 以空格为拼接符

 

 

第四部分:字典

一、NSDictionary(不可变字典)

  1.创建

 1     // 1)类方法
 2     NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"lidong", @"name", @25, @"age", nil];
 3     NSDictionary *dic2 = [NSDictionary dictionaryWithObjects:@[@"lidong", @25] forKeys:@[@"name", @"age"]];
 4     NSDictionary *dic3 = [NSDictionary dictionaryWithDictionary:dic1];
 5     // 2)对象方法
 6     NSDictionary *dic4 = [[NSDictionary alloc] initWithObjectsAndKeys:@"lidong", @"name", @25, @"age", nil];
 7     NSDictionary *dic5 = [[NSDictionary alloc] initWithObjects:@[@"lidong", @25] forKeys:@[@"name", @"age"]];
 8     NSDictionary *dic6 = [[NSDictionary alloc] initWithDictionary:dic1];
 9     // 3)快捷创建(key : value)
10     NSDictionary *dic7 = @{@"name":@"lidong", @"age":@25};

  总结:

    1)字典中的key必须是字符串类型,而value可以是任意的对象类型

    2)对于同一个字典,不允许存储相同的key(key作为字典中value的唯一标识)

    3)字典中的元素不是按照初始化的顺序存放,而是按照存取速度最快的方式存储,所以对于字典不讨论按下标取值

  2.NSDictionary的常用方法

 1     NSDictionary *dic8 = @{@"one":@"1", @"two":@"2", @"three":@"3", @"four":@"4", @"five":@"5", @"":@"1"};
 2     // 1)获取键值对的个数
 3     NSUInteger count1 = [dic8 count];
 4     NSUInteger count2 = dic8.count;
 5     
 6     // 2)获取字典的value
 7     // 通过方法
 8     id value1 = [dic8 objectForKey:@"2"];
 9     // 通过key
10     id value2 = dic8[@"one"];
11     // 获取所有的value
12     NSArray *allValues = [dic8 allValues];
13     
14     // 3)获取字典的key
15     // 通过所有指定相同value所对应的所有key
16     NSArray *allKeys1 = [dic8 allKeysForObject:@"1"];
17     // 获取所有的key
18     NSArray *allKeys2 = [dic8 allKeys];
19     
20     // 4)遍历字典 -- 枚举器法
21     // 遍历value
22     NSEnumerator *enumerator1 = [dic8 objectEnumerator];
23     id value = nil;
24     while (value = [enumerator1 nextObject]) {
25         NSLog(@"value = %@", value);
26     }
27     // 遍历key
28     NSEnumerator *enumerator2 = [dic8 keyEnumerator];
29     NSString *key = nil;
30     while (key = [enumerator2 nextObject]) {
31         NSLog(@"key = %@, value = %@", key, dic8[key]);
32     }

 

二、NSDMutableDictionary(可变字典)

 1     // 常用操作方法 -- 增删改
 2     NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjects:@[@"lidong", @"boy", @25, @"19900908", @170, @100] forKeys:@[@"name", @"sex", @"age", @"year", @"height", @"weight"]];
 3     // 1.增(注意:当初始化字典中没有"academic"这个key时,才是增加;否则为修改当前字典当前key的value值)
 4     [dict setObject:@"本科" forKey:@"academic"];
 5     // 2.删
 6     // 1)根据指定的key,删除key-value对
 7     [dict removeObjectForKey:@"name"];
 8     // 2)根据指定的数组key,删除多个key-value对
 9     [dict removeObjectsForKeys:@[@"sex", @"age", @"year"]];
10     // 3)删除所有
11     [dict removeAllObjects];
12     // 3.改
13     // 1)字典重置
14     [dict setDictionary:@{@"name":@"baocun", @"age":@25, @"relationship":@"classmate"}];
15     // 2)修改某一对key-value(只能修改value)
16     [dict setValue:@24 forKey:@"age"];

 

 

第五部分:集合

一、NSSet(不可变集合)

 1     // 1.创建
 2     NSString *str1 = @"one";
 3     NSString *str2 = @"two";
 4     NSString *str3 = @"three";
 5     NSSet *set = [[NSSet alloc] initWithObjects:str1, str2, str3, nil];
 6     
 7     // 2.元素的个数
 8     NSUInteger count1 = [set count];
 9     NSUInteger count2 = set.count;
10     
11     // 3.判断是否包含
12     BOOL isContains = [set containsObject:str3];
13     if (isContains) {
14         NSLog(@"YES");
15     } else {
16         NSLog(@"NO");
17     }
18     
19     // 4.遍历
20     NSEnumerator *enumerator = [set objectEnumerator];
21     NSString *value = nil;
22     while (value = [enumerator nextObject]) {
23         NSLog(@"value = %@", value);
24     }

  总结:

    1)NSSet也是无序的

    2)NSSet最重要的功能:NSSet中不能够存储重复的数据,可以用它来去除重复的值(去重)

 

二、NSMutableSet(可变集合)

 1     NSString *str1 = @"one";
 2     NSString *str2 = @"two";
 3     NSString *str3 = @"three";
 4     NSString *str4 = @"four";
 5     NSArray *arr = [NSArray arrayWithObjects:str2, str3, str4, nil];
 6     
 7     // 1.创建一个可变集合
 8     NSMutableSet *muSet = [[NSMutableSet alloc] init];
 9     
10     // 2.常用方法 -- 增删查
11     // 1)增
12     [muSet addObject:str1];  // 增加一个对象
13     [muSet addObjectsFromArray:arr]; // 增加一个数组
14     // 2)删
15     [muSet removeObject:str1]; // 删除指定对象
16     [muSet removeAllObjects];  // 删除所有
17     // 3)查
18     NSEnumerator *enumerator = [muSet objectEnumerator];
19     NSString *value = nil;
20     while (value = [enumerator nextObject]) {
21         NSLog(@"value = %@", value);
22     }
23     
24     // 3.集合最重要的功能:去重
25     NSArray *array = @[@"lidong", @"18", @"18", @"lidong", @"boy", @"18"];
26     // NSArray ---> NSSet
27     NSMutableSet *set = [NSMutableSet setWithArray:array];

 

 

第六部分:集合类的内存管理

  总结:对于内存管理,不管是在ARC模式,还是MRC模式,我们都需要考虑其内存溢出问题。对于MRC是毋庸置疑的;而对于ARC,其实也存在内存溢出的问题。ARC模式下的集合类如果处理不当很容易造成内存溢出的问题。下面的关于数组在MRC和ARC两种模式下的内存管理就可以说明这一问题。

一、MRC模式

 1     Person *p = [[Person alloc] init];   // retainCount = 1
 2     NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:0];
 3     
 4     // 当把对象存入到数组中时,数组会对该对象作一次retain操作
 5     [array addObject:p];   // 对于对象p而言:[p retain];
 6     
 7     // 当将某一个对象从数组中移除,数组会对该对象作一次release操作
 8     [array removeObject:p]; // 对于对象p而言:[p release];
 9     
10     // 当清空数组时,数组会对其内部所有对象元素作一次release操作
11     [array removeAllObjects];
12     
13     // 当对数组对象执行release操作时,数组会对其内部所有对象元素作一次release操作
14     [array release];
15 
16    //  [p release];

 

二、ARC模式

 1     Person *p = [[Person alloc] init];  // 保存了一个对象p的强指针
 2     NSMutableArray *array = [[NSMutableArray alloc] init];
 3     
 4     // 当把对象存入到数组中,数组会默认保存该对象的强指针
 5     [array addObject:p];
 6     
 7     // 当将某一个对象从数组中移除时,数组会释放掉该对象的强指针
 8     [array removeObject:p];
 9     
10     // 当清空数组时,数组会释放其内部所有对象的强指针
11     [array removeAllObjects];
12     
13     // 当对数组指针销毁时,数组会释放其内部所有对象的强指针
14     array = nil;
15     
16     // 销毁对象p
17     p = nil;

 

 

第七部分:二进制数据类型

一、NSData(不可变二进制数据)

1     // NSData与NSString之间的互相转化
2     // 1.NSString ---> NSData
3     NSString *str1 = @"Welcome to Shenzhen !";
4     NSData *data = [str1 dataUsingEncoding:NSUTF8StringEncoding];
5     
6     // 2.NSString ---> NSData
7     NSString *str2 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

 

二、NSMutableData(可变二进制数据)

 

 

第八部分:NSDate(日期)

 1     // 1.获取当前日期
 2     NSDate *now = [NSDate date];
 3     // 模拟昨天日期(NSTimeInterval:本质就是double类型)
 4     NSTimeInterval secondes = 24 * 60 * 60;
 5     // 日期加上某一个秒数
 6     NSDate *yesDay = [now addTimeInterval:-secondes];
 7     
 8     // 2.比较日期
 9     // 判断两个日期是否相同
10     BOOL isEqual = [now isEqualToDate:yesDay];
11     if (isEqual) {
12         NSLog(@"日期相同");
13     } else {
14         NSLog(@"日期不相同");
15     }
16     
17     // 获取两个日期中比较早的日期
18     NSDate *earler = [yesDay earlierDate:now];
19     NSLog(@"比较早的日期:%@", earler);
20     
21     // 获取两个日期中比较玩的日期
22     NSDate *later = [yesDay laterDate:now];
23     NSLog(@"比较晚的日期:%@", later);
24     
25     // 3.NSDate ---> NSString
26     NSDate *date1 = [NSDate date];
27     // 初始化日期格式对象
28     NSDateFormatter *formatter1 = [[NSDateFormatter alloc] init];
29     // 设置日期格式
30     [formatter1 setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; // 2016/01/07
31     // 把格式与我们的日期关联起来
32     NSString *dateStr1 = [formatter1 stringFromDate:date1];
33     NSLog(@"dateStr1 = %@", dateStr1);
34     
35     // 4.NSString ---> NSDate
36     NSString *dateStr2 = @"2016/01/07";
37     NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init];
38     // 设置格式
39     [formatter2 setDateFormat:@"yyyy/MM/dd"];
40     // 设置时区
41     [formatter2 setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
42     NSDate *date2 = [formatter2 dateFromString:dateStr2];
43     NSLog(@"date2 = %@", date2);

 // 日期

posted @ 2016-01-14 17:04  Frank9098  阅读(152)  评论(0)    收藏  举报