Day01:
Foundation框架
一、Foundation课程安排
1.NSObject、NSString、NSMutableString
2.NSNumber、NSValue、NSDate、NSArray NSMutableArray
3.NSArray的遍历、NSArray的新语法(IOS6)、NSArray Copy、NSArray排序
4.NSSet、NSMutableSet、NSDictionary、NSMutableDictionary、Block代码段(函数指针)
二、Api应用程序接口 文档(说明书)
Application Program Interface
三、Foundation简介
Foundation Framework OSX IOS 基本框架
类库(Class Library)
*基础类:
NSObject、NSString、NSMutableString
NSNumber、NSValue、NSDate…
*集合类:
NSArray、NSSet、NSMutableSet、 NSDictionary、NSMutableDictionary
网络类:…
文件类:...
四、NSObject
1.概述:所有类的父类,提供了系统运行时的一些基本功能。
2.类的初始化
a.类加载的时候,自动调用+load方法
b.当第一次使用类时,自动调用+initialize方法
c.类在使用之前会执行此方法,且只会执行一次
3.对象的创建和释放
alloc init dealloc new([[xxx alloc]init])
4.-copy
a.并不是所有对象都有copy方法,如果一个对象支持copy功能,首先要遵守协议NSCopying协议,必须实现copyWithZone方法。
b.如果不但想复制对象,而且还要复制对象的值,一般还要重写有参的初始化方法。
5.类对象
a.类实例化变成对象,类的对象。(堆)
b.类加载到内存中并创建类在内存中的对象(代码区),类对象。
c.普通的类不占堆内存空间,类对象是占代码区空间的。
d.向类发送class消息,可以创建类对象。
Class class = [TRStudent class];
e.比较“类”信息的时候,需要使用类对象,判断一个类是否是另一个类的子类。
[TRPerson isSubclassOfClass:[TRStudent class]]
f.避免多态使用时的不安全性问题
6.方法选择器 @selector
a.和C语言中的函数指针相类似
b.SEL就是方法的类型 sel方法变量
SEL sel = @selector(study);
c.某个类是否存在某个方法(消息)
BOOL b = [TRStudent instancesRespondToSelector:@selector(study)]
d.可以向对象发送任何消息,而不需要在编译的时候声明这些消息
[stu2 performSelector:sel2];
与普通向对象发送消息区别:编译器不会验证是否声明该方法,直接向对象发送消息,最好验证一下对像是否存在该消息,以保证代码的安全性。
7.协议选择器
a.协议的引用指向一个协议
Protocol* p = @protocol(NSCopying);
b.可以判断一个类是否遵守了某个协议
BOOL b = [TRStudent conformsToProtocol:p];
8.其它方法
a.判断一个引用指向的对象是否是某种类型或子类型
-(BOOL)isKindOfClass:(Class)c;
b.判断一个引用(实例)指向的对象是否是某种类型
-(BOOL)isMemberOfClass:(Class)c;
c.比较类信息的时候,需要使用类对象,判断一个类是否是另一个类的子类
+(BOOL)isSubclassOfClass:(Class)c;
练习:
1.定义三个类,TRAnimal、TRDog、TRCat。
TRDog与TRCat继承TRAnimal。
a.TRAnimal有属性age,有一个eat能力(显示 age属性的值,并输出调用了eat方法)
b.创建一个TRDog对象,且属性值为5
c.复制该对象<验证是遵守NSCopying>,向第二个TRDog对象performSelector发送消息(eat)<判断对象是否含有eat消息或是否继承TRAnimal>。
(注:安全性有几种判断方式?方法、本类、本类或子类、子类)
五、NSString
1.在C语言中,是没有专门的字符串类型,我们是通过字符数组来实现一个字符串。
2.在OC中专门的类型来描述字符串类型,NSString。
3.字符串比较特殊,遵循一个"不变模式",一个字符串一但创建,字符串对象就不可以改变,不可改变的字符串是可以重复使用的,所以相同值的字符串对象,一般只会创建一个对象。
4.有些字符串存在常量值中(代码区),有些字符串直接存在堆区。
5.字符串的使用
a.字符串创建
1)空字符串 NSString* str = [[NSString alloc]init];
2)字符串在创建的时候,如果已经存在,不会创建新的字符串。NSString* str = @"Hello";
NSString* str2 = @"Hello";
3)按指定格式来创建字符串
NSString* str3 = [NSString stringWithFormat:@"%@ World",str];
4)如果使用stringWithFormat方法创建的字符串,就算内容相同,地址也不一样。
5)通过文件内容创建字符串,注意存在编码集的问题,默认为ASC(不包含中文),要指定相应的中文编码集(GBK简体中文、GB2312简体中文、BIG5繁体中文、UTF8全世界主流语言…)
参数1 文件的路径
参数2 指定文件的编码集
参数3 出现异常处理
NSString* str7 = [NSString stringWithContentsOfFile:@"/Users/apple/Desktop/testString" encoding:NSUTF8StringEncoding error:nil]
b.字符串的比较 判断等值
1)str==str1 XXX
==只能判断两个字符串是否指向了同一个对象,(引用的地址是否相同)不能判断两个字符串的内容是否相同。
2)判断两个字符串值是否相同,isEqualToString方法,比较当前字符串与对应字符串值是否相同,严格区分大小写的。
c.比较字符串的大小
通常在字符串排序的时候,需要用到比较字符串的小。
1)compare方法可以比较两个字符串,比较字符串中的字符的ASC码的值
2)返回值有三种结果 NSComparetionResult
NSOrderedSame 两者相等 0
NSOrderedAscending后者比前者大 -1升序
NSOrderedDecending前者比后者大 1降序
d.忽略大小写比较字符串
1)caseInsensitiveCompare这个方法
2)在验证码功能的时候,会用到此方法
六、NSMutableString 可变字符串
可以改变字符串内容的功能,它是NSString的子类。
1.初始化
a.空字符串 有意义
NSMutableString* str = [[NSMutableString alloc]init];
b.创建字面值 无意义
不建议用此方式创建可变字符串,字面值字符串的内容,在代码区是无法改变的
NSMutableString* str2 = @"abc";
2.修改字符串的内容
a.在指定位置 添加新的字符串
参数1 添加的字符串内容
参数2 添加的字符串在原字符串中的位置
注:下标是从0开始计算
[str3 insertString:@"123" atIndex:1];
b.可以替换指定位置的字符串
NSRange range={1,3};//位置,长度
[str3 replaceCharactersInRange:range withString:@"bcd"];
c.删除指定位置的字符串,后面的字符串会向前补齐
[str3 deleteCharactersInRange:range];
3.两个字符串对象的操作
a.追加字符串
NSMutableString* str4 = [NSMutableString stringWithString:@"abc123"];
[str4 appendString:@"bcd"];
b.按照指定格式追加字符串
[str4 appendFormat:@"123%@bcd",@"def"];
4.截取字符串
a.从指定下标开始,包含开始位置截取字符串
subStringFromIndex
从中间到最后
b.从0开始,到指定位置,不包含指定位置
subStringToIndex
从开始到中间
c.指定范围截取字符串
subStringWithRange
NSRange range = {location,length};
5.字符串大小写转换
a.将所有的字符串内容变为大写字母
uppercaseString
b.将所有的字符串内容变为小写字母
lowercaseString
c.将单词的首字母大写
capitalizedString
6.得到字符串的前缀和后缀
TRStudent.h 前缀(TR)和后缀(.h)
如果一个字符串是文件名,那么可以得到这个字符串的前缀和后缀。
a.判断一个文件是否有某个前缀
BOOL b = [str hasPrefix:@"TR"];
b.判断一个文件是否有某个后缀
BOOL b = [str hasSuffix:@".h"];
根据身份证号码,求出生年月日?
230119197007010000
————————
Day02:
一、NSNumber数值对象
在很多类使用的时候,如果使用数值,就需要将数值转换成对象类型,而基本数据类型是无法使用的,所以说我们就要封装基本数据类型变为对象类型,数字对象的常用处理方式和使用与基本数据类型无差别。
1.数字对象的初始化
//封装
int i = 10;//基本数据类型
//对象类型
NSNumber* number = [NSNumber numberWithInt:i];
2.数字对象转换为基本数据类型
//解封
int i2 =[number intValue];
二、NSValue
1.有时需要创建一个对象,以密切反应原始数据类型或者数据结构,这种情况就需要使用NSValue类,它可以将任何C中有效的变量类型封装成对象类型。
2.NSNumber是NSValue的子类
3.使用NSValue封装一个结构体
a.定义一个结构体类型
typedef struct _Point{
int x;
int y;
}Point2;
b.声明一个结构变量并且赋值
Point2 point;
point.x = 10;
point.y = 20;
c.通过NSValue类,将结构类型封装成NSValue对象
参数1 结构体变量的内存地址
参数2 内存地址对应的结构体类型
NSValue* value = [NSValue valueWithBytes:&point objCType:@encode(Point2)];
d.把结构体对象转换成结构体类型
Point2 point2;
[value getValue:&point2];
1.将基本数据类型int、char、float、double分别封装成对象类型,输出其值。
2.将对象类型,拆封变为基本数据类型,输出其值。
三、NSDate 日期
1.NSDate存储的是时间信息,默认存储的是世界标准时间(UTC),输出时需要根据时区转换为本地时间。中国大陆、香港、澳门、台湾…的时间增均与UTC时间差为+8,也就是UTC+8。
2.初始化 得到当前的时间
NSDate* date = [[NSDate alloc]init];
3.得到一个时间,和当前比延迟30秒
NSDate* date2 = [NSDate dateWithTimeIntervalSinceNow:30];
4.和时间对比 返回秒数
NSTimeInterval second = [date timeIntervalSince1970];
5.比较两个时间 哪个更早
NSDate* earlierDate = [date earlierDate:date2];
6.比较两个时间 哪个更晚
NSDate* laterDate = [date laterDate:date2];
7.将世界标准时间转换成当地时间
8.将UTC时间转换为当地时间
a.创建模板对象
NSDateFormatter* dateFormatter
=[[NSDateFormatter alloc]init];
//hh12小时制mm分钟ss秒 HH24小时制
//MM月dd日yyyy年
dateFormatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";
b.通过模板对象 将时间对象转换成字符串
NSString* strDate = [dateFormatter stringFromDate:date];
根据身份证号码,求出生年月日,年龄?(subString…字符串截取)
230119197007010000
四、NSArray 数组
1.概述
数组是一组有序的集合,通过索引下标取到数组中的各个元素,与字符串相同,数组也有可变数组(NSMutableArray)和不可变数组(NSArray),数组中不可以保存基本数据类型、结构体数据类型,需要使用NSNumber和NSValue进行数据"封装"。
2.初始化方法
a.空数组
NSArray* array = [NSArray array];
b.数组中只有一个元素
NSArray* array2 = [NSArray arrayWithObject:@"one"];
c.数组中有多个元素
NSArray* array3 = [NSArray arrayWithObjects:@"one",@"two",@"three", nil];
2.初始化方法
d.通过一个已有的数组 创建新的数组
NSArray* array4 = [NSArray arrayWithArray:array3];
3.数组的常用方法
a.数组的长度
NSUInteger length = [array4 count];
b.通过数组的下标得到数组中元素
NSString* objStr = [array4 objectAtIndex:0];
3.数组的常用方法
c.遍历数组
for (int i = 0; i<[array4 count]; i++) {
NSString* str = [array4 objectAtIndex:i];
}
练习:
1.向数组中存放数据,
int i = 10;char c = 'a';
BOOL b = YES
TRStudent age:18 name:zhangsan;
当前的系统时间
2.遍历输出数组对象。
练习:
1.创建一个学生类TRStudent,有年龄、有姓名,创建五个学生对象,放到数组中,遍历数组,输出学生的姓名和年龄。
2.查询(遍历)五个学生信息,只显示姓名为zhangsan的信息。
3.只显示年龄为18岁学生的信息。
四、NSArray 数组
4.在原来数组上添加一组对象并创建新的数组
NSArray* array4 = [array arrayByAddingObjectsFromArray:array2];
5.在原来数组上加一个数组对象并创建新的数组
NSArray* array3 = [array arrayByAddingObject:array2];
6.将数组中的元素按指定符号连接起来变为字符串。
NSString* arrayStr = [array4 componentsJoinedByString:@":"];
7.将字符串拆分成数组
NSArray* stringArray = [arrayStr componentsSeparatedByString:@":"];
8.判断数组中是否包含某个对象,返回值是布尔值类型
BOOL b = [stringArray containsObject:@"5"];
9.获取某个对象在数组的下标,如果数组中不存在该对象,则返回一个垃圾值下标
NSUInteger index = [stringArray indexOfObject:@"5"];
10.获取数组中最后一个元素
NSString* lastObject = [stringArray lastObject];
11.如果数组中保存某个对象,给数组中所有该对象发送一个消息,数组中的所有对象必须拥有该消息。
存在安全性问题 慎用
[students makeObjectsPerformSelector:@selector(study)];
练习:
第一位 第二位
判断ip:155.155.100.100属于哪个城市?
第一位 0~100,第二位 0~100 广州
第一位 101~200,第二位 0~101 北京
第一位 101~200,第二位 101~200 上海
NSString* str = [array1 componentsJoinedByString:@"."];
NSLog(@"str:%@",str);
NSArray* stringArray = [arrayStr componentsSeparatedByString:@":"];
学生->班级->学院->学校
8个 4个 2个 1个
a.查询(遍历)所有学生信息。
b.只显示姓名为zhangsan的信息。
c.只显示年龄为18岁学生的信息。
d.如果每个学生有本书,所有学生书的名称(名称、价格)。
————————
Day03:
四、NSMutableArray(可变数组)
1.初始化方法
NSMutableArray* array = [NSMutableArray array];
NSMutableArray* array2 = [NSMutableArray arrayWithObjects:@"one",@"two",@"three", nil];
2.向数组中添加一个元素
[array2 addObject:@"1"];
3.向数组中添加一个元素在指定位置
[array2 insertObject:@"2" atIndex:2];
NSLog(@"array2:%@",array2);
4.删除数组中指定下标元素
[array2 removeObjectAtIndex:1];
5.删除指定对象
[array2 removeObject:@"1"];
6.替换指定下标的元素
参数1 下标 参数2 替换的内容
[array2 replaceObjectAtIndex:1 withObject:@"two"];
NSLog(@"array2:%@",array2);
7.删除数组所有元素
[array2 removeAllObjects];
NSLog(@"array2:%@",array2);
五、遍历(三种遍历)
1.for循环遍历(老方式)
2.***快速枚举 效率高
for (NSString* str in array) {
NSLog(@"str:%@",str);
}
3.迭代器遍历
a.每个数组或集合都有一个自己的迭代器
NSEnumerator* enumerator = [array objectEnumerator];
b.每次迭代时要发送消息
[enumerator nextObject])
1)返回当前指向数组中的对象,并且自动向下移动一位
2)如果没有对象时,则返回nil,并且终止迭代。
while (obj = [enumerator nextObject])
五、NSArray支持的新语法
1.ios6.0及osx10.8之后,编译器LLVM支持
2.初始化数据
C:int array[]={1,2,3};
OC:[NSArray arrayWithObjects:@"a",@"b",nil];
OC新:NSArray* array = @[@"a",@"b"];
3.根据下标得到数组中的元素的值
OC:[array objectAtIndex:0];
OC新:array[0];
六、数组复制(深拷贝(内容复制)、浅拷贝(引用复制))
1.复制对象:指针复制(浅拷贝)、内容复制(深拷贝
2.数组中的元素,对象的引用。
3.浅拷贝:新数组和原有数组共享内存中的对象。
NSArray* array2 = [[NSArray alloc]initWithArray:array copyItems:NO];
4.深拷贝:新数组和原有数组都有独享的对象。
NSArray* array3 = [[NSArray alloc]initWithArray:array copyItems:YES];
六、数组的排序
1.可以让数组对象按着一定规则进行排序
2.类必须实现compare方法(排序规则)
3.规则原理:
返回值有三种结果 NSComparetionResult
NSOrderedSame 两者相等 0
NSOrderedAscending后者比前者大 -1升序
NSOrderedDecending前者比后者大 1降序
4.发送排序的消息
NSArray* array2 = [array sortedArrayUsingSelector:sel];
1.创建五个学生对象,按姓名排序。
2.按年龄排序升序、降序。
3.先年龄升序再按姓名升序(年龄相等的人,再按姓名排序)。
一、NSSet集合
1.概念
NSSet是一个无序的,管理多个对象的集合类,最大特点是集合中不允许出现重复对象,和数学上的集合含义是一样的。
除了无序、不许重复之外,其它功能和NSArray是一样的。
2.重复
什么叫重复(一样)?
a.同一个对象
b.两个对象信息值相同
计算机认为的一样:同一个对象。
3.对象的哈希值(hash)
a.Set中确定对象是否是重复的?例如A对象和B对象,先调用A对象的hash方法得到一个整数,再调用B对象的hash方法得到一个整数,如果整数不相同,计算机就认为两个对象是不同的对象。(没有重复)
b.重写hash方法,如果hash值相同,此时会再调用对象的isEqual方法,再次判断两个对象是否相同。
1)对象类型
//自反性
if(self == object){
return YES;
//类型
}else if (object isMemberOfClass:[TRStudent class]){
...//判断对象中的每一个属性的值
}else{
return NO;
}
2)对象中每一个属性
//判断对象中每一个属性的值
TRStudent* stu2 = object;
if ([self.name isEqualToString:stu2.name]) {
return YES;
}
创建TRPoint类,有两个属性x,y值。
创建三个对象放到NSSet集合中。
point1(3,5) point2(3,6) point3(3,5)
遍历NSSet集合,使用快速枚举、迭代器。
4.遍历
a.快速枚举
for (TRPoint* point in points) {
NSLog(@"point x:%d y:%d",point.x,point.y);
}
4.遍历
b.迭代器
NSEnumerator* enumerator=[points objectEnumerator];
TRPoint* obj;
while (obj = [enumerator nextObject]) {
NSLog(@"NSEnumerator point x:%d y:%d",obj.x,obj.y);
}
NSSet NSMutableSet(重构)
学生->班级->学院->学校
8个 4个 2个 1个
a.查询(遍历)所有学生信息,只显示姓名为zhangsan的信息。
b.只显示年龄为18岁学生的信息。
Day04:
二、字典 NSDictionary NSMutableDictionary
1.概念
a.是由键-值对组合的集合,正如,我在查询字典的单词的定义一样。Key-vale
b.通过key(键),相应的value(值)。通常来讲,key的值是字符串类型,value的值是任意对象类型。
c.key值是不允许重复的,value的值是可以重复的。
d.通来来讲key与value的值,不允许为空
e.可以保存多条数据。
2.集合的使用
a.初始化
NSDictionary* dic = [[NSDictionary alloc]init];
初始化时,会依次添加元素的value和key
NSDictionary* dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"4",@"four",@"3",@"three",@"2",@"two",@"1",@"one", nil];
b.如果key重复,会舍掉后面的,编译不会报错。
3.向集合中添加元素 NSMutableDictionary
添加一个元素
[dic2 setValue:@"5" forKey:@"five"];
4.查找集合中的元素
NSString* value = [dic2 objectForKey:@"three"];
5.得到所有key值
NSArray* keys = [dic2 allKeys];
6.遍历
NSArray* keys = [dic2 allKeys];
for (NSString* key in keys) {
NSString* value = [dic2 objectForKey:key];
NSLog(@"key:%@->value:%@",key,value);
}
NSDictionary NSMutableDictionary(重构)
学生->班级(Set)->学院(Dic)->学校(Dic)
8个 4个 2个 1个
1.查询某个班的学生信息
2.查询某个学院的学生信息
3.查询某个学生的信息