黑马程序员-⑨Foundation框架(上)
2015-01-21 13:23
399 查看
------- <a href="http://www.itheima.com" target="blank">ios培训</a>、<a href="http://www.itheima.com" target="blank">ios培训</a>、期待与您交流!
---------
1. 常用结构体
NSRange(location length)、NSPoint/CGPoint、NSSize/CGSize、NSRect\CGRect
1.1NSRange是表示范围的结构体,
它在Foundation中的定义如下:
如何声明并初始化一个NSRange:
按照C语言中对结构体初始化的方法:
上面的两种初始化方法是不推荐的,推荐使用下面的方式进行初始化(调用NSMakeRange函数):
NSRange常见的一个用法:
查找某个字符串在str中的范围
如果找不到,length = 0,location=NSNotFound==-1(%d)
示例
1.2 NSPoint\CGPoint、NSSize/CGSize、NSRect\CGRect
顾名思义,我们可以猜测NSPoint表示的是点,实际上NSPoint的定义为:
开发中常用CGPoint,因为CGPoint是跨平台
CGPoint的定义为:
显然CGPoint里面定义了表示点的两个坐标值:x和y。它们都是CGFloat类型的数据,CGFloat其实就是double类型。
按照刚才初始化一个NSRange类型的数据的方式初始化一个NSPoint:
但实际上最常用的是另一种方法:
结构体NSSize/CGSize
typedef CGSize NSSize;
开发中常用CGSize,因为CGSize是跨平台
同样地,也有初始化它们的类似方法:
结构体NSRect\CGRect(CGPoint CGSize)
定义
CGRect方法
NSRect\CGRect常用来表示UI元素在屏幕中的区域
初始化NSRect\CGRect方法:
也可以这样初始化:
其中CGPointZero == CGPoint(0, 0);表示(0, 0)点。
在Foundation中拥有将结构体直接转为字符串的全局方法:
示例
NSPoint\CGPoint、NSSize/CGSize、NSRect\CGRect有就几个在开发中常用的函数:
使用CGPointZero等的前提是添加CoreGraphics框架
比较两个点是否相同(x, y)
判断CGRectMake范围是否包含CGPointMake这个点
2.NSString类和NSMutableString类(父类和子类的关系)
2.1 NSString类:不可变字符串
NSString类也就是OC中的字符串类。
创建一个NSString对象的方法:
1.最简单
2.最繁琐(一般不用)
3.创建格式化的字符串
4.C语言字符串转成OC字符串
5.OC字符串转成c语言字符串
还有更强大的用法,从一个文件中获取字符串:
从一个URL中获取字符串:
URL : 资源路径
协议头://路径(路径也可以是网页,例如@“www.baidu.com”)
为此我们先定义一个URL:
以上方法可以直接使用类方法 不用每次都alloc
一般都会有个类方法跟对象方法配对
YES代表写入中途中断则不创作新文件 NO代表写入中途中断仍创作新文件
②NSMutableString(可变的字符串)
NSMutableString常用的方法有,拼接字符串到当前字符串后面:
拼接内容到s1的后面
删除字符串中的字符:
方法的简化:
NSString也可以实现上面的字符串拼接功能,但是NSString不可变,必须要用新的值就接受拼接后的字符串:
3.NSArray和NSMutableArray
NSArray、NSSet、NSDictionary称为集合类
(1)NSArray是数组类可以存放一些数据,只要是对象,类型是可以不同的,且存放在NSArray中是有序的
为什么要引入NSArray数组类,先看C语言中数组的局限性:
C语言的数组不够灵活,只能存放一种数据类型;
C语言的数组面向过程,几乎没有什么可以操作数组的方法,且操作起来非常困难。
NSArray的要求:
OC数组只能存放oc对象 不能存放非OC对象,如int、struct、enum等等;
OC数组不能存放空值(数组以nil为结束)。
创建一个数组:
但是这个数组永远是空数组,因为NSArray不可变,创建时没有指定元素,所以长度为0但是又不能添加元素。
应当这样创建:
数组类的常用操作:获取数组元素的个数:
访问数组的元素(按索引):
简写方式:array[i];
这是种编译器特性,编译器会将array3[0]转换为 [array3 objectAtIndex:0];
针对NSArray的编译器特性,用于快速创建数组:@[];
NSArray *array4 = @[@"jack", @"rose"];// 编译器特性 编译器转换成arrayWithObjects方法
注意:
这时候不能再加上结束标识nil,否则报错。
数组的遍历
方法一:
方法二:(for each)
方法三:使用遍历方法enumerate并用block做参数
其内部相当于执行了下面的代码:
stop停止原理
---------
1. 常用结构体
NSRange(location length)、NSPoint/CGPoint、NSSize/CGSize、NSRect\CGRect
1.1NSRange是表示范围的结构体,
它在Foundation中的定义如下:
typedef struct _NSRange { NSUInteger location; //代表位置 NSUInteger length; //代表长度 } NSRange;
如何声明并初始化一个NSRange:
按照C语言中对结构体初始化的方法:
NSRange r1 = {2, 4}; // 不用 NSRange r2= {.location = 2, .length = 4}; // 不用
上面的两种初始化方法是不推荐的,推荐使用下面的方式进行初始化(调用NSMakeRange函数):
NSRange r3 = NSMakeRange(2, 4); // 掌握
NSRange常见的一个用法:
查找某个字符串在str中的范围
NSString *str = @"i love you”; NSRange range1 = [str rangeOfString:@"love"]; NSLog(@"loc = %ld, length = %ld", range1.location, range1.length);// ->location = 2, length = 4
如果找不到,length = 0,location=NSNotFound==-1(%d)
示例
NSString *str = @"i love you”; // 查找某个字符串在str中的范围 NSRange range2 = [str rangeOfString:@"java"]; NSLog(@"loc = %ld, length = %ld", range2.location, range2.length); // ->location = NSNotFound ,length = 0
1.2 NSPoint\CGPoint、NSSize/CGSize、NSRect\CGRect
顾名思义,我们可以猜测NSPoint表示的是点,实际上NSPoint的定义为:
typedef CGPoint NSPoint;
开发中常用CGPoint,因为CGPoint是跨平台
CGPoint的定义为:
struct CGPoint { CGFloat x; CGFloat y; }; typedef struct CGPoint CGPoint;
显然CGPoint里面定义了表示点的两个坐标值:x和y。它们都是CGFloat类型的数据,CGFloat其实就是double类型。
按照刚才初始化一个NSRange类型的数据的方式初始化一个NSPoint:
CGPoint p1 = NSMakePoint(10, 10);
但实际上最常用的是另一种方法:
NSPoint p2 = CGPointMake(10, 10); // 最常用
结构体NSSize/CGSize
typedef CGSize NSSize;
开发中常用CGSize,因为CGSize是跨平台
struct CGSize { CGFloat width; CGFloat height; }; typedef struct CGSize CGSize;
同样地,也有初始化它们的类似方法:
NSSize s1 = NSMakeSize(100, 50); NSSize s2 = CGSizeMake(100, 50); //最常用
结构体NSRect\CGRect(CGPoint CGSize)
定义
struct CGRect { CGPoint origin; CGSize size; }; typedef struct CGRect CGRect;
CGRect方法
CGRect myRect(CGFloat x, CGFloat y, CGFloat width, CGFloat height) { CGRect rect; rect.origin.x = x; rect.origin.y = y; rect.size.width = width; rect.size.height = height; return rect; }
NSRect\CGRect常用来表示UI元素在屏幕中的区域
初始化NSRect\CGRect方法:
NSRect r1 = CGRectMake(0, 0, 100, 50); //方式1 CGRect r2 = {{0, 0}, {100, 90}}; // 方式2 CGPoint p1 = NSMakePoint(10, 10); NSSize s1 = NSMakeSize(100, 50); CGRect r3 = {p1, s1}; // 方式3
也可以这样初始化:
CGRect r4 = {CGPointZero, CGSizeMake(100, 90)};
其中CGPointZero == CGPoint(0, 0);表示(0, 0)点。
在Foundation中拥有将结构体直接转为字符串的全局方法:
NSStringFromPoint(CGPoint); NSStringFromSize(CGSize); NSStringFromRect(CG dfd1 Rect);
示例
CGRect r = {CGPointZero, CGSizeMake(100, 90)}; NSString *str = NSStringFromRect(r); // 将结构体转为字符串打印 NSLog(@"%@", str);
NSPoint\CGPoint、NSSize/CGSize、NSRect\CGRect有就几个在开发中常用的函数:
使用CGPointZero等的前提是添加CoreGraphics框架
比较两个点是否相同(x, y)
BOOL b = CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));
判断CGRectMake范围是否包含CGPointMake这个点
BOOL b1 = CGRectContainsPoint(CGRectMake(0, 0, 100, 50), CGPointMake(2, 3)); NSLog(@"%d", b1);
2.NSString类和NSMutableString类(父类和子类的关系)
2.1 NSString类:不可变字符串
NSString类也就是OC中的字符串类。
创建一个NSString对象的方法:
1.最简单
NSString *s1 = @“jack”;
2.最繁琐(一般不用)
NSString *s2 = [[NSString alloc] initWithString:@“jack”];
3.创建格式化的字符串
NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d", 10];
4.C语言字符串转成OC字符串
NSString *s4 = [[NSString alloc] initWithUTF8String:"C语言字符串"];
5.OC字符串转成c语言字符串
const charchar *cs = [s4 UTF8String];
还有更强大的用法,从一个文件中获取字符串:
// NSUTF8StringEncoding 用到中文就可以用这种编码 格式: [[NSString alloc] initWithContentsOfFile:绝对地址 encoding:NSUTF8StringEncoding error:nil]; 示例: NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/Mike/Desktop/note/目标.txt" encoding:NSUTF8StringEncoding error:nil];
从一个URL中获取字符串:
URL : 资源路径
协议头://路径(路径也可以是网页,例如@“www.baidu.com”)
为此我们先定义一个URL:
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/1.txt"]; NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/1.txt"]; NSString *s6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
以上方法可以直接使用类方法 不用每次都alloc
一般都会有个类方法跟对象方法配对
[NSURL URLWithString:<#(NSString *)#>];//返回URL类型对象 [NSString stringWithFormat:@“”];//返回NNString类型对象 [NSString stringWithContentsOfFile:<#(NSString *)#> encoding:<#(NSStringEncoding)#> error:nil];
把字符串写到文件中[@"Jack\nJack" writeToFile:路径 atomically:YES encoding:NSUTF8StringEncoding error:nil];
YES代表写入中途中断则不创作新文件 NO代表写入中途中断仍创作新文件
②NSMutableString(可变的字符串)
NSMutableString常用的方法有,拼接字符串到当前字符串后面:
NSMutableString *s1 = [NSMutableString stringWithFormat:@"age is %10”];
拼接内容到s1的后面
[s1 appendString:@" 11 12"]; NSLog(@"s1 = %@", s1); // s1 = age is 10 11 12
删除字符串中的字符:
NSMutableString *s1 = [NSMutableString stringWithFormat:@"age is 10"]; [s1 deleteCharactersInRange:NSMakeRange(4, 2)]; //删除位置(4,2)的字符串 NSLog(@"s1 = %@", s1); // s1 = age 10
方法的简化:
[s1 deleteCharactersInRange:[s1 rangeOfString:@"is"]]; //删除字符串is NSLog(@"s1 = %@", s1); // s1 = age 10
NSString也可以实现上面的字符串拼接功能,但是NSString不可变,必须要用新的值就接受拼接后的字符串:
NSString *s2 = [NSString stringWithFormat:@"age is 10"]; NSString *s3 = [s2 stringByAppendingString:@" 11 12"]; // s2不变 新的字符串用s3接收 NSLog(@"s2 = %@, s3 = %@", s2, s3); // s2 = age is 10, s3 = age is 10 11 12
3.NSArray和NSMutableArray
NSArray、NSSet、NSDictionary称为集合类
(1)NSArray是数组类可以存放一些数据,只要是对象,类型是可以不同的,且存放在NSArray中是有序的
为什么要引入NSArray数组类,先看C语言中数组的局限性:
C语言的数组不够灵活,只能存放一种数据类型;
C语言的数组面向过程,几乎没有什么可以操作数组的方法,且操作起来非常困难。
NSArray的要求:
OC数组只能存放oc对象 不能存放非OC对象,如int、struct、enum等等;
OC数组不能存放空值(数组以nil为结束)。
创建一个数组:
NSArray *array = [NSArray array];
但是这个数组永远是空数组,因为NSArray不可变,创建时没有指定元素,所以长度为0但是又不能添加元素。
应当这样创建:
NSArray *array2 = [NSArray arrayWithObjects:@"jack", nil ]; // 并且以nil作为结束。
数组类的常用操作:获取数组元素的个数:
NSLog(@"%ld", array2.count); //[array count];
访问数组的元素(按索引):
NSLog(@"%@", [array3 objectAtIndex:1]);
简写方式:array[i];
NSLog(@"%@", array3[0]); // 编译器特性 <span style="font-family: 宋体; background-color: rgb(255, 255, 255);"> </span>
这是种编译器特性,编译器会将array3[0]转换为 [array3 objectAtIndex:0];
针对NSArray的编译器特性,用于快速创建数组:@[];
NSArray *array4 = @[@"jack", @"rose"];// 编译器特性 编译器转换成arrayWithObjects方法
注意:
这时候不能再加上结束标识nil,否则报错。
数组的遍历
方法一:
NSArray *array = @[p, @"rose", @"jack"]; for (int i = 0; i < array.count; i++) { NSLog(@"%@", array[i]); }
方法二:(for each)
// 快速遍历数组元素 for (id obj in array) //每次执行把array中一个元素赋值给obj { NSUInteger i = [array indexOfObject:obj]; // 找出obj元素在数组中的位置 NSLog(@"%ld----%@", i, obj); }
方法三:使用遍历方法enumerate并用block做参数
// 没遍历到一个元素,就会调用一次block // 并且当前元素和索引位置当做参数传给block [array enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOLBOOL *stop) { NSLog(@"%ld---%@", idx, obj); }];
其内部相当于执行了下面的代码:
void ^(myblock)(id, NSUInteger, BOOLBOOL *) = ^(id obj, NSUInteger idx, BOOLBOOL *stop) { NSLog(@"%ld - %@", idx, obj); };
stop停止原理
void ^(myblock)(id, NSUInteger, BOOLBOOL *) = ^(id obj, NSUInteger idx, BOOLBOOL *stop) { NSLog(@"%ld - %@", idx, obj); if(idx == 1)//当idx等于1的时候停止 { *stop = YES; } }; for循环中 for (int i = 0; i<array.count; i++) { // 用来标记是否需要停止遍历 BOOL isStop = NO; // 取出元素 id obj = array[i]; myblock(obj, i, &isStop); if (isStop) { break; } }
相关文章推荐
- 黑马程序员------[Foundation]Foundation框架
- 黑马程序员——Foundation框架结构体、字符串、数组
- 【黑马程序员】【Foundation框架】NSNumber、NSValue和NSData
- 黑马程序员_Foundation框架基础知识(二)集合类
- 黑马程序员-OC-Foundation框架总结一
- 【黑马程序员】Foundation框架(NSString)
- 【黑马程序员】-Foundation框架-集合及其它
- 黑马程序员-OC-Foundation框架基本介绍
- 黑马程序员-Foundation框架之NSArray类
- 【黑马程序员】OC-Foundation框架—NSString和NSRange
- 黑马程序员--iOS--Objective-C基础 (Foundation框架 一 )
- 黑马程序员——Foundation框架——NSArray和NSMutableArray
- 黑马程序员------Foundation框架------NSDictionary字典
- 黑马程序员-----Foundation框架学习之Copy学习
- 黑马程序员————Foundation框架_知识总结(上)
- 黑马程序员—Foundation框架之NSArray与NSMutableArray
- 黑马程序员-------Foundation框架 NSRange
- 黑马程序员——Foundation框架字典、集合类、反射
- 黑马程序员--Foundation框架基础
- 黑马程序员--Foundation框架总结