您的位置:首页 > 职场人生

【黑马程序员】---Foundation框架总结01

2015-03-15 11:30 295 查看
------- android培训java培训、期待与您交流! ----------

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] in
4000
itWithString:@"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文件管理者这个类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息