-------
android培训、
java培训、期待与您交流! ----------
Foundation框架总结---(02)
1.NSArray(不可变数组)
(1)数组的创建
// 这个array永远是空数组
NSArray *array = [NSArray array];
NSArray *array2 = [NSArray arrayWithObject:@"jack"];
// nil是数组元素结束的标记
NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose", nil];
//NSArray *array4 = [NSArray arrayWithObjects:@"jack", @"rose", @"4324324", nil];
// 快速创建一个NSArray对象
NSArray *array4 = @[@"jack", @"rose", @"4324324"];
心得体会:
(1)NSArray是不可变数组,创建数组的时候有几个元素,数组就是几个元素
(2) OC数组只能存放OC对象、不能存放非OC对象类型,比如int、struct、enum等,还有OC数组不能存放nil值。
(3)oil是数组的结束标记
(3)NSArray是有序的。
(2)计算NSArray的元素
NSLog(@"%ld", array3.count);
(3)NSArray中元素的访问
NSLog(@"%@", [array3 objectAtIndex:1]);
NSLog(@"%@", array3[0]);
心得体会:
array[3]是OC的编译器特性。
(4)遍历数组
1>.用for循环遍历数组
Person *p = [[Person alloc] init];
NSArray *array = @[p, @"rose", @"jack"];
for (int i = 0; i<array.count; i++)
{
NSLog(@"%@", array[i]);
}
2>.高级for循环遍历数组
for (id obj in array) // id obj代表着数组中的每一个元素
{
// 找出obj元素在数组中的位置
NSUInteger i = [array indexOfObject:obj];
NSLog(@"%ld - %@", i, obj);
}
3>.利用block遍历数组
[array enumerateObjectsUsingBlock:
// 每遍历到一个元素,就会调用一次block
// 并且当前元素和索引位置当做参数传给block
^(id obj, NSUInteger idx, BOOL *stop)
{
NSLog(@"%ld - %@", idx, obj);
if (idx == 0)
{
// 停止遍历
*stop = YES;
}
}];
// void ^(myblock)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *stop)
// {
// NSLog(@"%ld - %@", idx, obj);
//
//
// if (idx == 0)
// {
// // 停止遍历
// *stop = YES;
}
};
心得体会:
(1)最好用的是用block遍历数组,既能得到对象又能得到当前对象的位置
(2)此时block作为函数的参数适用。
(3)要注意BOOL *stop,出入传入一个指针,方便通过指针改变实参的值。
2.NSMutableArray (可变数组)
(1)可变数组的创建
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil];
(2)向可变数组添加元素
[array addObject:[[Person alloc] init]];
[array addObject:@"jack"];
(3)删除可变数组元素
// 1.删除全部元素
[array removeAllObjects];
// 2.删除指定的对象
[array removeObject:@"jack"];
// 3.按数组下标删除对象
[array removeObjectAtIndex:0];
(4)注意一种常见的错误写法
// @[] 只创建不可变数组NSArray
NSMutableArray *array = @[@"jack", @"rose"];
[array addObject:@"jim"];
心得体会:
(1)@[]用于创建一个不可变数组,而不可变数组不可以添加元素。
(2)可变数组NSMutableArray和不可变数组NSArray有很多相似的地方,要学会对比学习。
3.NSSet
(1)NSSet的创建
NSSet *s = [NSSet set];
NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];
(2)NSSet元素的取出:
// 随机拿出一个元素
NSString *str = [s2 anyObject];
心得体会:
(1)NSset是随机存放的,所以取元素不能像数组NSArray那样用下标,只能用函数anyObject随机取元素。
4.NSMutableSet
(1)NSMutableSet的创建
NSMutableSet *s = [NSMutableSet set];
(2)NSMutableSet添加元素
[s addObject:@"hack"];
(3)NSMutableSet删除元素
[s removeObject:<#(id)#>];
心得体会:
(1)NSSet和NSArray都是集合,都能存放多个OC对象。
(2)NSArray有顺序,NSSet没有顺序。
5.NSDictionary
(1)NSDictionary的创建
// 第1种创建方式:
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];
// 第2种创建方式:
NSArray *keys = @[@"name", @"address"];
NSArray *objects = @[@"jack", @"北京"];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
// 第3种创建方式:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
@"jack", @"name",
@"北京", @"address",
@"32423434", @"qq", nil];
// 第4种创建方式:
NSDictionary *dict = @{@"name" : @"jack", @"address" : @"北京"};
(2)NSDictionary元素的取出
// 第1种取出方式:
id obj = [dict objectForKey:@"name"];
// 第2种取出方式:
id obj = dict[@"name"];
心得体会:
(1)利用@{}创建NSDictionary,是编译器特性,方便,好用
(2)利用dict[@"key"]取出NSDictionary元素也是编译器特性,记住。
(3)其它一些方法多敲敲,要熟练
(4)NSDictionary也是无序的。
6. NSMutableDictionary
(1) NSMutableDictionary的创建
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
(2) NSMutableDictionary添加键值对
[dict setObject:@"jack" forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];
[dict setObject:@"rose" forKey:@"name"];
(3) NSMutableDictionary移除键值对
[dict removeObjectForKey:<#(id)#>];
心得体会:
NSMutableDictionary的用法基本上跟其它的集合用法一样,要类比学习。
常见错误代码:
NSMutableDictionary *dict = @{@"name" : @"jack"};
[dict setObject:@"rose" forKey:@"name"];
心得体会:
不可变的NSMutableDictionary没有setObject方法,也就是不能添加元素。
(4)NSMutableDictionary的遍历
[dict enumerateKeysAndObjectsUsingBlock:
^(id key, id obj, BOOL *stop) {
NSLog(@"%@ - %@", key, obj);
// *stop = YES;
}];
NSArray *keys = [dict allKeys];
for (int i = 0; i<dict.count; i++)
{
NSString *key = keys[i];
NSString *object = dict[key];
NSLog(@"%@ = %@", key, object);
}
(5)数组当中存放一个dictionary
NSArray *persons = @[
@{@"name" : @"jack", @"qq" : @"432423423", @"books": @[@"5分钟突破iOS编程", @"5分钟突破android编程"]},
@{@"name" : @"rose", @"qq" : @"767567"},
@{@"name" : @"jim", @"qq" : @"423423"},
@{@"name" : @"jake", @"qq" : @"123123213"}
];
心得体会:
(1)字典dictionary是无序的
(2)字典dictionary不允许有相同的key,但允许有相同的value(Object)
(6)NSNumber
NSNumber将基本数据类型包装成oc对象
(1)将一个int类型数值包装成NSNumber对象
NSNumber *num = [NSNumber numberWithInt:10];
(2)将一个NSNumber对象转换为int类型
int a = [num intValue];
(3)将各种基本数据类型包装成NSNumber对象的简单写法:
@10.5;
@YES;
@'A'; // NSNumber对象
@"A"; // NSString对象
(4)一个变量包装成NSNumber对象
// 将age变量包装成NSNumber对象
int age = 100;
@(age);
心得体会:
将一个常量和变量包装成OC对象的简写方式有差异,常量@10.5,变量@(age)。它们都是编译器特性。
(7)NSValue
NSNumber之所以能包装基本数据类型为对象,是因为继承了NSValue
NSValue
能够将结构体包装成OC对象
CGPoint p = CGPointMake(10, 10);
// 将结构体转为Value对象
NSValue *value = [NSValue valueWithPoint:p];
将value转为对应的结构体
[value pointValue];
心得体会:
如果将一个基本数据类型包装成oc对象就用NSNumber,如果将一个结构体和枚举包装成oc对象就用NSValue。
(8)NSDate
1>创建一个时间对象
NSDate *date = [NSDate date];
// 打印出的时候是0时区的时间(北京-东8区)
NSLog(@"%@", date);
2>.创建
日期格式化类
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
3>代码实例(将一个日期类以指定字符串格式输出)
NSDate *date = [NSDate date];
// 日期格式化类
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// y 年 M 月 d 日
// m 分 s 秒 H (24)时 h(12)时
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString *str = [formatter stringFromDate:date];
NSLog(@"%@", str);
4>代码实例(将一个字符串,以指定格式生成日期对象)
NSString *time = @"2011/09/10 18:56";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy/MM/dd HH:mm";
NSDate *date = [formatter dateFromString:time];
NSLog(@"%@", date);
心得体会:
(1)[date2 timeIntervalSince1970]获取从1970年开始走过的秒数,我们现在的时间都是通过这个计算出来的。
(2)我们国家处在东9区,相比格林时间快了8小时。
(3)日期类其它一些方法,平时要多练习,熟练生巧,不用刻意记,知道有这功能就行。
(4)平时要养成写博客的习惯,多联想,多对比, 多记笔记。