————————Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———————
一、Cocoa框架的大致了解
苹果为我们提供了丰富和完善的框架体系,我们只要合理使用这些框架就能完成绝大部分的工作,极大的提高了我们的编程效率。下面我们简要了解一下这些框架和使用场合。
1、Cocoa框架
Cocoa框架是苹果创建的专门用于MacOS和IOS的原生API,由NeXtSTEP演变而来,严格遵守MVC模型,他是一个庞大的框架集合,我们本节所要了解的各种框架,都是Cocoa框架的一个个部分,Cocoa框架可以自适应MAC OS和IOS两大平台,
2、Foundation框架
在前面的学习中,我们主要用到的就是Foundation框架,Foundation框架规范了基本的OC结构类型、表达式、消息传递等机制,设置了NSObject基类及服务,并在此基础上,创建了大量基础的对象类。
3、UIKit框架
UIKit是IOS中用于构建用户界面及用户交互的基本框架,可以说,一个IOS应用程序离不开UIKit框架,该框架包含了UIView、UIButton、UITextfield、UIResponder等基本的用户交互类,以及UIColor、UIImage、UINib等相关类,我们可以直接调用UIkit中为我们提供的丰富交互类库,同时可以在此基础上定制自己的UI对象,实现丰富的用户界面。
4、Core Data框架
该框架采用SQLlite技术创建和管理对象,优化内存存储,同时支持基于文档的应用程序,包括NSAtomic、NSFetchRequest、NSManagedObject、NSSaveChangesRequest等类。我们如果要实现undo/redo、优化存储、管理表视图结果以及创建基于文档的应用程序时,需要用到Core Data中的功能。
5、Core Graphics框架
该框架为底层绘图函数库,可以实现UIKit无法实现的复杂图形的绘制(如曲线的绘制),我们可以用他来创建基于路径的绘图,进行图形的抗锯齿渲染以及图片、PDF、梯度、颜色等信息的底层处理,
6、Quartz Core框架
我们采用UIKit框架创建一个窗体,一个按钮,或者播放一个视频,其实归根结底,还是要用到Quarzt Core框架,这个框架为我们提供屏幕显示最基本的层、帧、运动和变形等实现,如果我们要实现一些UIKit没给我们提供的功能或者特效,就要用到Quarzt Core框架里的类或者功能。
7、OpenGL ES框架
该框架支持2D和3D绘图及渲染,是一个完整的游戏引擎,他直接访问底层设备,提供高速、复杂的视觉体验,能够创建2D和3D图形,实现复杂的图形分析和变化,一般用来制作视觉冲击较大的大型游戏及娱乐项目,也可以用来分析和研究图形。
这些框架在开发过程中可能都会涉及到,我们在此是基础的学习,更偏向于将Foundation框架的服务搞懂了。以后学到其他框架的使用,我会再总结。
二、Foundation框架
1. Foundation框架的主头文件名称就是Foundation.h
2. Foundation框架包含了很多数据类型(结构体,枚举)和类
3.Foundation框架中的结构体(NSRange,NSPoint(CGPoint),NSSize(CGSize),NSRect(CGRect))
1)NSRange(表示范围)(包含两个成员:location,length)
例1:@"I love oc";中 love范围可表示为(location=2 length=4)
[10,19,20,21,22]最后三个数(20,21,22)的范围是(location=2,length=3)
例2:表示@"I love oc";中 love的范围
NSRange r = NSMakeRange(2,4);
例3:查看@"I love oc";中 love的范围
NSString * str = @"I love oc";
NSRange range = [str rangeOfString:@"love"];
NSLog(@"location=%d,length=%d",range.location,range.length);
2. NSPoint(CGPoint)(表示点坐标(x,y))
创建方式:
CGPoint P1=NSMakePoint(10,10)
NSPoint P2=CGPointMake(10,10)
3. NSSize(CGSize)(表示尺寸)(宽度(width)高度(height))
创建方式:
CGSize S1=CGSizeMake(100,20)
NSSize S2=CGMakeSize(20,10)
4. NSRect(CGRect)
CGRect r1=CGRectMake(0,0,100,50)//CGRect包含了CGPoint(0,0)和CGSize (100,50)
5. 将结构体转换为字符串:
CGPoint P1=NSMakePoint(10,10);
NSString*str= NSStringFromPoint(P1); //将P1这个结构体转成字符串
NSLog(@"%@",str); // 输出结果为{10,10}
6.结构体的其它用法
1)坐标原点的表示方法
(1)CGPointMake(0,0)
(2)CGPoint Zero
2)判断两个点是否相同(BOOL类型)
CGPoint EqualToPoint((CGPoint point1),(CGPoint point2))//可以将 CGPoint换成CGSize或者 CGRect
3)判断一个点是否在一个范围内
CGRectContainsPoint((CGRect rect),(CGPoint point))
使用这些函数的前提是CoreGraphics框架
三、NSString(不可变)
1. 字符串(NSString)的创建方式
(1)NSString * s1=@"4234";
(2)NSString * s2=[[NSString alloc] initwithstring :@"jack"];(不常用)
(3)NSString * s3=[[NSString alloc] initwithFormat :@"age is %d",10] ;
(4)NSUTF8StringEncoding用到中文就可以用这种编码
NSString*s5=[[NSString alloc] initwithContentsOfFile:@"/Users/apple/Desktop/1.txt"encoding:NSUTF8StringEncoding error:nil]; //桌面文件路径
//URL:资源路径(协议头://路径)
网络资源 : http://
本地资源 : file://
服务器资源: ftp://
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/1.txt"];
NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/1.txt"];
(5)NSString *s6 = [[NSString alloc] initWithContentsOfURL:urlencoding:NSUTF8StringEncoding error:nil];
(6)NSString *s7 = [s2 stringByAppendingString:@" 1112"];
一般都会有一个类方法跟对象方法配对
[NSURL URLWithString:<#(NSString *)#>];
[NSString stringWithFormat:@""];
[NSString stringWithContentsOfFile:<#(NSString *)#>encoding:<#(NSStringEncoding)#> error:<#(NSError *__autoreleasing*)#>];
2. C语言字符串与OC字符串的转换
(1)C语言字符串转为OC字符串:NSString *s7 = [[NSString alloc]initWithUTF8String:"jack"];
(2)OC字符串转为 C语言字符串:constchar *cs = [s4 UTF8String];
3. 将一个字符创写到文件中
[@"Jack\nJack"writeToFile:@"/Users/apple/Desktop/my.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
//将"jack"这个字符串写进/Users/apple/Desktop/my.txt这个文件中去(一般写Yes,安全性高)
也可以调用类方法实现:
[str writeToURL:url atomically:YESencoding:NSUTF8StringEncoding error:nil];
4. 输出: NSLog(@”我在%@上课”,str);
5. 获取当前字符串的长度:[str length];//字符串length方法返回的是字符串的字数(空格算一个字)
四、NSMutableString(NSString的子类)(可变的)
1. NSString所有的创建方式,NSMutableString都拥有
2. NSMutableString是可变的,可以往里面增加或删除内容
3. 拼接
NSMutableString *s1 = [NSMutableStringstringWithFormat:@"my age is 10"];
[s1 appendString:@" 11 12"]; // 拼接内容到s1的后面
4. 删除
NSMutableString *s1 = [NSMutableStringstringWithFormat:@"my age is 10"];
[s1 deletecharactersInRange:NSMakeRange(4,2)]; //删除s1中某个位置范围的字符
5. 如果要删除某个固定的字符
(1)首先获取is的范围
NSRange range = [s1 rangeOfString:@"is"];
(2)再进行删除
[s1 deleteCharactersInRange:range];
补充:NSString也有appendstring方法,但是它不会改变原来的字符串,只是返回了一个新的拼接好的字符串
五、NSArray(不可变数组)(有序的)
1. Foundation框架下有很多类:NSString,NSArray,NSSet,NSDictionary,NSDate,NSObject
2. NSArray是一个集合类(只能存放OC对象,不能存放非OC对象(基本数据类型:int,struct,enum))
3. 创建方式:
(1)NSArray*array=[NSArraywithobjects:@"jack",@"rose",nil]; //nil是数组元素结束的标志
(2)快速创建:NSArray*array=@[@"jack",@"rose"] //一般选用这种创建方式
4. OC数组不能存放空值(nil)
5. 数组元素的个数:
[array count];
NSLog(@"%ld",array.count)
6. 拿出数组中的某个元素
(1)[array objectAtIdex:1]; //拿出数组的第一个元素
(2)array[0]; (一般选用这种方式)
7. NSArray的遍历
(1)
for(int i=0;i<array.count;i++)
{
NSLog(@ "@%",array[i]);
}
(2)快速遍历
for (id obj in array) // id obj代表数组中的每一个元素,把array中的每个元素拿出来,赋值给obj
{
// 找出obj元素在数组中的位置
NSUInteger i=[arrayindexOfObject :obj];
NSLog(@"%@-%@",i,obj);
}
(3)利用block
[array enumerateObjectsUsingBlock:
// 每遍历到一个元素,就会调用一次block
// 并且当前元素和索引位置当做参数传给block
^(id obj, NSUInteger idx, BOOL *stop) //stop为停止遍历
{
NSLog(@"%ld - %@", idx, obj);
if (idx == 0)
{
// 停止遍历
*stop = YES;
}
}];
六、NSMutableArray(NSArray的子类)(可变数组)(无序的)
1. 添加元素
NSMutableArray*array=[NSMutableArray array];
[array addobject:[[person alloc]init]];
[array addobject:@"jack"];
2. 删除元素
[array removeAllobjects]; //删除所有元素
[array removeobject:@"jack"];//删除指定元素"jack"
[array removeobjectAtIndex:2];//删除第二个元素
错误写法
(1)[array addobject:10]; //OC数组不能存放基本数据类型
(2)[array addobject:nil]; //不能为空
(3)NSMutableArray*array=@[@"jack",@"rose"];//@[]只可以创建不可变数组NSArray
七、NSDictionary
顾名思义,这是一个字典类,如字典一样,知道一个字母便可找到对应的许多内容,那么NSDictionary里面放的就是类似字典的键值。key是索引,value是对应的值。字典的无序的,字典不允许有相同的key,但允许有相同的value(Object)
1.创建一个字典
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 = <span style="font-family: Arial, Helvetica, sans-serif;">[NSDictionary dictionaryWithObjectsAndKeys:@"jack", @"name",@"北京", @"address",@"32423434", @"qq", nil ];</span>
4)快速创建
NSDictionary *dict = @{@"name" : @"jack", @"address" : @"北京"};
2.根据键找到值
id obj = [dict objectForKey:@"name"]== id obj = dict[@"name"];
NSLog(@"%@", obj);
3.返回的是键值对的个数
NSLog(@"%ld", dict.count);
4.遍历字典
1)
NSArray *keys = [dict allKeys];
for (int i = 0; i<dict.count; i++)
{
NSString *key = keys[i];
NSString *object = dict[key];
NSLog(@"%@ = %@", key, object);
}
2)
[dict enumerateKeysAndObjectsUsingBlock:
^(id key, id obj, BOOL *stop) {
NSLog(@"%@ - %@", key, obj);
// *stop = YES;
}];
}
5.NSMutableDictionary
1)创建可变的字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
2)添加键值对
[dict setObject:@"jack" forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];
3)移除键值对
[dict removeObjectForKey:<#(id)#>];
NSLog(@"%@", dict);
6.数组与字典的混合使用
NSArray *persons = @[
@{@"name" : @"jack", @"qq" : @"432423423", @"books": @[@"5分钟突破iOS编程", @"5分钟突破android编程"]},
@{@"name" : @"rose", @"qq" : @"767567"},
@{@"name" : @"jim", @"qq" : @"423423"},
@{@"name" : @"jake", @"qq" : @"123123213"}
]; //数组里有字典,字典里面有词典
NSDictionary *jim = persons[2]; NSLog(@"%@", jim);表示jim所在的那个字典
NSString *bookName = persons[0][@"books"][1]; NSLog(@"%@", bookName); 先取数组0位置对应的字典,再取出自带里book数组的第2本书
NSArray *array = persons[0][@"books"]; NSLog(@"%@", array); 将书全部放在arry数组里面
NSLog(@"%@", persons[1][@"qq"]); 先取出1位置对应的字典,再取出字典中qq这个key对应的数据
集合的总结:
集合
1)NSArray\NSMutableArray
* 有序
* 快速创建(不可变):@[obj1, obj2, obj3]
* 快速访问元素:数组名[i]
2)NSSet\NSMutableSet
* 无序
3)NSDictionary\NSMutableDictionary
* 无序
* 快速创建(不可变):@{key1 : value1, key2 : value2}
* 快速访问元素:字典名[key]
八、NSNumber
OC中的NSNumber就是一般数据类型的类,它可以将一般数剧类型包装成对象。
1.将基本数据类型转为NSNumber
NSNumber *num = [NSNumber numberWithInt:10];
int=[num intValue];
NSNumber *n = [NSNumber numberWithDouble:10.5];
int d = [n doubleValue];
2.数据转为NSString
int a=20;
NSString *str = [NSString stringWithFormat:@"%d", a]; 这将20转为@"20" 即数据转为string
NSLog(@"%d", [str intValue]);
3.快速转为NSNumber
将各种基本数据类型包装成NSNumber对象
@10.5;
@YES;
@'A'; 注意:@"A"; 它是 NSString对象
将age变量包装成NSNumber对象
int age = 100;
@(age);或者[NSNumber numberWithInt:age];
九、NSDate
OC中将日期也封装成一个NSDate类,是它是一个日期时间类.
1.创建一个时间对象
NSDate *date = [NSDate date];
打印出的时候是0时区的时间(北京-东8区)
NSLog(@"%@", date);
NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date]; //表示从运行到此行代码时间5秒钟后的时间
2. 从1970开始走过的秒数
NSTimeInterval seconds = [date2 timeIntervalSince1970];
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);
十、NSValue
NSNumber之所以能包装基本数据类型为对象,是因为继承了NSValue。
1.结构体转为NSValue对象
CGPoint p = CGPointMake(10, 10);
将结构体转为Value对象
NSValue *value = [NSValue valueWithPoint:p];
2.将value转为对应的结构体
[value pointValue];
NSArray *array = @[value ];