Foundation框架总结---(01)
1.结构体
主要讲了一下4个结构体
(1) NSRange(location, length)
NSRange是一个结构体,其中location是一个以0为开始的index,length是表示对象的长度。他们都是NSUInteger类型。
NSRange的原型为:
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
心得体会:由此可见,NSRange是一个结构体,它由location和length两个成员组成。
typedef unsigned long NSUInteger;
NSRange的三种赋值方式:
NSRange r1 = {2, 4}; // 不用
NSRange r2 = {.location = 2, .length = 4};// 不用
NSRange r3 = NSMakeRange(2, 4); // 掌握
rangeOfString
方法:查找某个字符串在字符串的范围。
NSString *str = @"i love oc";
// 如果找不到,length=0,location=NSNotFound==-1
NSRange range = [str rangeOfString:@"java"];
NSLog(@"loc = %ld, length=%ld", range.location, range.length);
心得体会:-1如果按照无符号整型打印输出是一大串数字
(2) NSPoint\CGPoint
NSPoint的原型为:
struct CGPoint {
CGFloat x;
CGFloat y; // 其中x,y是double类型
};
NSPoint
用法:
//NSPoint指的是位置
NSPoint point;
//给结构体里面的点进行赋值
point.x = 10;
point.y = 10;
//快速创建点
point = NSMakePoint(10, 18);
//常见的是CGPointMake创建点的函数
point = CGPointMake(29, 78);
NSString* str2 = NSStringFromPoint(point);
NSLog(@"point is %@",str2);
心得体会:CGPointMake 和 NSMakePoint是一样的。
(3)NSSize\CGSize
NSSize\CGSize原型:
struct CGSize {
CGFloat width;
CGFloat height;
};
NSSize
用法:
NSSize size;
size.width = 100;
size.height = 12;
size = NSMakeSize(12, 12);
size = CGSizeMake(11, 11);
NSString* str3 = NSStringFromSize(size);
NSLog(@"%@",str3);
(4) NSRect\CGRect (CGPint CGSize)
NSRect\CGRect 的原型:
struct CGRect {
CGPoint origin;
CGSize size;
};
赋值方式:
CGRect r1 = CGRectMake(0, 0, 100, 50);
CGRect r2 = { {0, 0}, {100, 90}};
CGRect r3 = {p1, s2};
// 使用CGPointZero等的前提是添加CoreGraphics框架
CGRect r4 = {CGPointZero, CGSizeMake(100, 90)};
// 表示原点
// CGPointZero == CGPointMake(0, 0)
NSMakeRect函数源代码:
NS_INLINE NSRect NSMakeRect(CGFloat x, CGFloat y, CGFloat w, CGFloat h) {
NSRect r;
r.origin.x = x;
r.origin.y = y;
r.size.width = w;
r.size.height = h;
return r;
}
其它重点函数用法:
(1)比较两个点是否相同(x、y)
BOOL b = CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));
(2)判断一个矩形是否包含一个点
BOOL b2 = CGRectContainsPoint(CGRectMake(50, 40, 100, 50), CGPointMake(60, 45));
心得体会:
(1)学习结构体的API,一定要会对比学习,很多函数以及用法都是能猜出来的。
(2)比如CGPoint等同于NSPoint,但一般都用以CG开头的,因为它跨平台。
(3)CGPointZero == CGPointMake(0, 0),它表示原点,用处较多。
(4)使用这些CGPointEqualToPoint、CGRectContainsPoint等函数的前提是添加CoreGraphics框架。
2.NSString
(1)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字符串
// C字符串 --> OC字符串
NSString *s4 = [[NSString alloc] initWithUTF8String:"jack"];
5> 创建字符串的第五种方式将OC字符串转换成C语言字符串
const char *cs = [s4 UTF8String];
6> 创建字符串的第六种方式NSUTF8StringEncoding 用到中文就可以用这种编码
NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil];
URL : 资源路径
协议头://路径
file://
ftp://
创建文件URL的2种方式:
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/1.txt"];
NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/1.txt"];
7> 创建字符串的第七种方式
NSString *s6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
一般都会有一个类方法跟对象方法配对
8> 创建字符串的第八种方式
[NSURL URLWithString:@"file:///Users/apple/Desktop/1.txt"];
9> 创建字符串的第九种方式[NSString stringWithFormat:@"age is %d", 10];
10>
创建字符串的第十种方式
[NSString stringWithContentsOfFile:@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil];
字符串导出的2种方式:
(1)写到文件中
[@"Jack\nJack" writeToFile:@"/Users/apple/Desktop/my.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
(2)写到指定的URL中
NSString *str = @"4234234";
NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/my2.txt"];
[str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
(2)NSMutableString : 可变字符串
1>创建可变字符串,并追加内容
NSMutableString *s1 = [NSMutableString stringWithFormat:@"my age is 10"];
// 拼接内容到s1的后面
[s1 appendString:@" 11 12"];
2>从一个长字符串中删除指定字符串
// 获取is的范围
NSRange range = [s1 rangeOfString:@"is"];
[s1 deleteCharactersInRange:range];
NSString *s2 = [NSString stringWithFormat:@"age is 10"];
3>NSString也可以在已有字符串追加字符串,但是它实际上是重新创建了新的字符串
NSString *s3 = [s2 stringByAppendingString:@" 11 12"];
心得体会:
(1)在创建字符串时,一般都会有一个类方法跟对象方法配对,并且在日常写代码时,最好用类方法,简单。
(2)在学习Foundation框架时,要注意对比学习,很多东西都是相通的。
(3)这些API不用刻意去记忆,平时多敲代码多积累。
3.写一个函数,计算文件代码的行数,可以是文件也可以是文件夹
#import <Foundation/Foundation.h>
// 计算文件的代码行数
/*
path : 文件的全路径(可能是文件夹、也可能是文件)
返回值 int :代码行数
*/
NSUInteger codeLineCount(NSString *path)
{
// 1.获得文件管理者
NSFileManager *mgr = [NSFileManager defaultManager];
// 2.标记是否为文件夹
BOOL dir = NO; // 标记是否为文件夹
// 标记这个路径是否存在
BOOL exist = [mgr fileExistsAtPath:path isDirectory:&dir];
// 3.如果不存在,直接返回0
if(!exist)
{
NSLog(@"文件路径不存在!!!!!!");
return 0;
}
// 代码能来到着,说明路径存在
if (dir)
{ // 文件夹
// 获得当前文件夹path下面的所有内容(文件夹、文件)
NSArray *array = [mgr contentsOfDirectoryAtPath:path error:nil];
// 定义一个变量保存path中所有文件的总行数
int count = 0;
// 遍历数组中的所有子文件(夹)名
for (NSString *filename in array)
{
// 获得子文件(夹)的全路径
NSString *fullPath = [NSString stringWithFormat:@"%@/%@", path, filename];
// 累加每个子路径的总行数
count += codeLineCount(fullPath);
}
return count;
}
else
{ // 文件
// 判断文件的拓展名(忽略大小写)
NSString *extension = [[path pathExtension] lowercaseString];
if (![extension isEqualToString:@"h"]
&& ![extension isEqualToString:@"m"]
&& ![extension isEqualToString:@"c"])
{
// 文件拓展名不是h,而且也不是m,而且也不是c
return 0;
}
// 加载文件内容
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// 将文件内容切割为每一行
NSArray *array = [content componentsSeparatedByString:@"\n"];
// 删掉文件路径前面的/Users/apple/Desktop/iOS课堂共享/0722课堂共享/
NSRange range = [path rangeOfString:@"/Users/apple/Desktop/iOS课堂共享/0722课堂共享/"];
NSString *str = [path stringByReplacingCharactersInRange:range withString:@""];
// 打印文件路径和行数
NSLog(@"%@ - %ld", str, array.count);
return array.count;
}
}
int main()
{
NSUInteger count = codeLineCount(@"/Users/apple/Desktop/iOS课堂共享/0722课堂共享");
NSLog(@"%ld", count);
return 0;
}
心得体会:
(1)首先,要知道计算一个文件行数的方法。然后,再利用递归,计算一个文件夹下所有文件的行数。
(2)注意这个函数[str componentsSeparatedByString:@"\n"],它是‘、n’将字符串进行切割,然后存储在数组中,求出数组的长度,即可求出单个文件的行数
(3)了解下NSFileManager文件管理者这个类。