您的位置:首页 > 移动开发 > IOS开发

IOS学习---OC基础学习(Foundation)

2014-10-25 23:16 218 查看
Foundation框架:
包含许多常见的数据类型 是其他所有Ios框架的基础

结构体:
NSRange:
范围:成员变量有location(位置)、length(长度)
@“i love oc”中love的位置和范围
NSRange ra = {2,4}
NSRange rb = {.location = 2,length = 4};
常用的是:
NSRange rc = NSMakeRange(2,4);

NSString *str = @"i love oc"
查找某个字符串在str中的范围:
NSRange range = [str rangOfString:@"love"]
若要查找的字符串不存在,那么length=0;location=NSNotFound=-1
NSUInteger = unsigned long 输出时以%ld的形式输出
NSLog(@"loc = %ld,length = %ld",rang.location,rang.length);

NSPoint\CGPoint:
也是一个结构体,包含了两个double类型的数值为成员(用来表示点的坐标)
开发中一般使用CGPoint 适合跨平台使用
CGPoint p1 = NSMakePoint(10,20);
CGPoint p2 = CGPointMake(10,10)
(CGPoint与NSPoint可以互换 但是后面的方法时二者专有)
NSSize\CGSize:
通常用来表示尺寸 高度和宽度
CGSize s1 = CGSizeMake(10,5);
CGSize s2 = NSMakeSize(10,5);
(CGSize与NSSize可以互换 但是后面的方法时二者专有)

NSRect\CGRect
成员变量有两个 CGPoint 类型的坐标(origin) CGSize类型的 尺寸(size)
CGRect c1 = CGRectMake(宽度,高度,x坐标,y坐标)
CGRect c2 = NSMakeRect(宽度,高度,x坐标,y坐标)

输出成员的方法:
NSLog(@"x=%f,y=%f,width=%f,height = %f",r1.origin.x,r1.origin.y,r1.size.width,r1.size.height);
过于麻烦
解决办法:将结果提转为字符串输出
NSString *str = NSStringFromPoint(p1);
NSLog(@"%@",str)
输出结果:{10,20}
同样,对于CGSize,CGRect可以使用
NSString * str1 = NSStringFromSize(s1);
输出结果{10,5}
NSString * str2 = NSStringFromRect(c1);
输出结果:{{10,20},{10,5}}

对于CGRect也可以通过下面的方法定义:
CGRect c3 = {{1,2},{3,4}};
CGRect c4 = {p1,s1};
设置原点
CGPointZero == CGPointMake(0,0);
例如:
CGRect c1 = {CGPointZero,CGSizeMake(10,9)};
同样:
CGSizeZero == CGSizeMake(0,0);长和宽都为0
CGRectZero == CGRectMake(0,0,0,0)

其他函数:
CGPointEqualToPoint(CGPoint p1,CGpoint p2) 返回布尔类型变量
比较两个点的位置是否相同
CGSizeEqualToSize(CGSize s1,CGSize s2)比较尺寸是否相同
CGRectEqualToRect(CGRect r1,CGRect r2)比较位置和尺寸是否相同

CGRectContainsPoint(CGRect r1,CGPoint p1)
判断CGRect对象 r1 的坐标是否是p1
CGRectContainsRect(CGRect r2,CGRect r3)
判断CGRect对象 r2 的尺寸是否为s2

使用上面这些函数的前提是添加CoreGraphics框架
(小知识: 话说乔布斯 被苹果赶出去的那段时间 创建了一个公司叫做 NextStep而这个公司创建了Foundation因此许多东西都是以NS开头的)

Foundation框架中常用的类
1、NSString
有一个子类 NSMutableString
NSString:不可变字符串
NSMutableString:可变字符串
(一)字符串的创建
NSString *s1 = @"jack";
NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d",10];
C字符串转为OC字符串
NSString *s4 = [[NSString alloc] initWithUTF8String:"jack"]
OC字符串转为C字符串
const char *cs = [s4 UTF8String];

读取文件中的字符
NSString *s5 = [[NSString alloc] initWithContentOfFile:@"路径(绝对路径) 名"excoding:NSUTF8StringEncoding(编码方式,用到中文就可以用这种编码方式) error:nil];
路径名格式:/Users/apple/Desktop/文件名

读取URL资源路径
//http://weibo.com/a.png 网络资源
协议头://路径(网络的是http)
file://本地资源
ftp://FTP服务器上的 http://www.baidu.com NSURL *url = [[NSURL alloc] initWithString:@file:///Users/apple/Desktop/1.text];
NSURL *url2 = [NSURL fileURLWithPath:@"/Users/apple/Desktop/1.text"]
NSString *s6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]

相应的类的方法(节省了alloc):
[NSString stringWithFormat:@""];

[NSString URLString:@""]
[NSString stringWithContentsOfFile]

把字符串写到文件中  文件中的换行可以使用/n
[@"jack  \n(换行)jack" writeToFile:@"/User/apple/Desktop/my.text" atomically:yes encoding:NSUTF8StringEncodingerror:nil]

对应的类方法
NSString *str = @"i love anglelababy";
NSURL *url = [NSURL fileURLwithPath:@"/User/apple/Desktop/my.txt"]
[str writeToURL:url atomically:YES encoding:NSUTF8StingEncoding error:nil]

NSMutableString:可变字符串
创建方法:
NSMutableString *s1 = [NSMutableString stringWithFormat:@"age is 10"];
NSString *s2 = [NSString stringWithFormat:@"age is10";]
NSLog("s1=%@ s2 = %@",s1,s2);输出结果相同

[s1 appendSting:@"11 12"];//拼接内容至s1后面

NSString *s3 = [s1 stringByAppendingString:@"11 12"];//补修改s1 而是新创建了一个字符串讲后面的字符拼接到这上面

[s1 deleteCharactersInRange(NUSInteger loc,NSUInteger len)]//删除字符串中的某个字符位置长度

[s1 deleteCharactersInRange(4,2)]//删除is

另一种方法:
NSRange range = [s1 rangOfString:@"is"];
[s1 deleteCharactersInRange:range];

集合类:
2、NSArray
不可变数组:
创建:
OC数组只能存放OC对象、不能存放非OC对象类型,比如int、struct、enum等  只要是OC对象什么类型都可以放 OC数组不能存放空值
//这个Array永远是空数组
NSArray * array1 = [Array array]//数组只有在初始化的时候才能放东西

NSArray *array2 = [NSArray arrayWithObject:@"jack"];object没有s
NSArray *array3 = [NSArray arrayWithObjects:@"jack",@"rose",nil];//nil是数组元素结束的标志  objects有S
[array2 count];返回数组中元素的个数
NSLog(@"%ld",array3.count);
[array3 objectAtIndex:1]访问数组中的某一个元素
array3[1]取出数组中下标为1的元素 同上一句功能

NSArray *array4 = [NSArray arrayWithObject:@"jack",@"rose",@"1234",nil];

//快速创建一个NSArray对象
NSArray *array4 = @[@"jack",@"rose",@"1234"];

OC数组 不问什么类型都可以往里放也不一定要一个类型的
遍历数组
Person *p = [[Person alloc] init];
NSArray *array = @[p,@"jack"];
for(int i =0;i<array.count;i++)
{
NSLog(@"%@",array[i]);
}

//遍历数组中的哪一个元素 将数组中的每个元素取出来赋给obj
for(id obj in array)
{
//返回obj在数组中的位置
NSUInteger i = [array indexOfObject:obj]
NSLog(@"@",obj);
}

[array enumerateObjectsUsingBlock:
//每遍历到一个元素就会调用一次block
//并且当前元素和索引位置当做参数传给block
^(id obj,NSUInteger idx,BOOL *stop)
{ //obj当前元素  idx当前变量的索引位置,stop停止遍历
NSLog(@"%ld --%@",idx,obj);
//如果需要停止遍历
if(idx == 0)
{
*stop = YES;
}
}];
实现过程:
void ^(myblock)(id,NSUInteger,BOOL *) = ^(id obj,NSUInteger,BOOL *stop)
{
NSLog(@"%ld --%@",idx,obj);
//如果需要停止遍历
if(idx == 0)
{
*stop = YES;
}
}];

for(int i= 0;i< array.count;i++)
{
//用来标记是否需要停止遍历
BOOL isStop = NO;

//取出元素
id obj = array[i];
myblock(obj,i,&isstop);
}

练习:计算代码行数:
考察NSString和NSArray的使用
NSFileManager
设计代码计算代码行数
//计算单个文件的代码行数
path:文件的全路径
返回值:int 代码行数
int codeLineCount(NSString *path){
//取出路径中的字符串
NSString *content = [NSString stringWithContentsOfFile:path encoding :NSUTF8StringEncoding error:nil];
//把文件内容分割开分割符为'\n'分开
NSArray *array = [content compentsSeparatedByString:@"\n"];
//验证 输入数组的每一行
for(NSString *line in array)
{
NSLog(@"%@",line);
i++;
}
return array.count;

}

NSFileManager:文件管理者
//1、获得文件管理者
NSFileManager *mgr = [NSFileManager defaultManager];
//2、判断path是文件夹还是文件路径
BOOL dir = NO;//标记是否为文件夹
//这个路径是否存在
BOOL exist = [mgr fileExistsAtPath:path isDirectory:&dir];
if(!exist)
{
NSLog(@"路径不存在");
return 0;
}

if(dir)
{
NSLog(@"这是个文件夹");
//array数组存放该文件夹下的文件或文件夹的名称
NSArray *array = [mgr contentsOfDirectoryAtPath:patherror:nil];
//遍历数组中的所有文件或者文件夹名
for(nsstring *filename in array)
{ //拼接全路径
nsstring *fullpath = [nsstring stringwithformat:@"%@/ %@",path,filename];
codelinecount(fullpath);
}

}
else
{
//加载文件内容

//将文件分割为每一行
}

有一个子类 NSMutableArray
创建:
NSMutableArray *array = [NSMutableArray array];
NSMutableArray *array = [NSMutableArray arrayWithObject:@"rose",@"jim",nil];

NSMutableArray *array = @[@"jack",@"rose"]; 错误
后面的@[]只能返回不可变的数组的元素因此 不符合条件

添加元素:
[array addObject:[[Person alloc] init]];
[array addObject:@"jack"];
[array addObject:nil]错误
OC数组不可添加基本数据类型
删除数组元素
删除所有:[array removeAllObject];
删除指定元素[array removeObject:@"jack"];
删除指定位置的元素:[array removeObjectAtIndex:2];

3、NSSet
可以存放多种类型的对象,除了基本数据类型 但是存储是无序的
创建一个set
NSSet *set = [NSSet set];
NSSet *set = [NSSet setWithObject:@"jack"];//不能放空值
NSSet *set = [NSSet setWithObjects:@"jack",@"rose",nil];

NSLog(@"%d",set.count);

NSString *s = [set anyObject];//随机取出一个元素

有一个子类 NSMutableSet
NSMutableSet *set = [NSMutableSet set];

//增加元素
[s addObject:@"hack"];
//删除元素
[s removeObject:@"hack"];

NSSet与NSArray的对比
二者的共同点:
1、都是集合,都能存放多个OC对象
只能存放OC对象,不能存放非OC对象类型(基本数据类型,int char float等,结构体,枚举,)
本身都不可变 但是有一个可变的子类

2、不同点
NSArray 是有序的 NSSet是无序的

4、NSDictionary
字典:存放的是键值对(key,value) 不可以修改
作用:
根据索引 找到文字内容(key --->value)
创建:
NSDictionary *d = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];
id obj = [dict objectForKey:@"name"];

NSArray *keys = @[@"name",@"address"];
NSArray *object = @[@"jack",@"北京"];
NSDictionary *d = [NSDictionary dictionaryWithObject:object forKey:keys];

NSDictionary *d = [NSDictionary dictionaryWithObjectAndKeys:@"jack",@"name",@"北京",@"address",@"1223435246",@"qq"];

NSDictionary *d = @[@"name":@"jack",@"address",@"北京",@"qq",@"23438529"];

根据key找object
id obj = [dict objectForKey:@"name"];

id obj = dict[@"name"];

//返回键值对的个数
dict.count

有一个子类NSMutableDictionary
//创建
NSDictionary *d = [NSDictionary dictionary];

//添加键值对
[dict setObject:@"jack" forKey@"name"];
[dict setObject:@"北京" forKey@"address"];

[dict setObject:@"rose" forKey:@"name"];

//根据键值取数据
dict[@"name"];

//移除键值对
[dict removeObjectForKey:(id)];

打印字典内容
结果以:name=" " address=""形式打印

字典的遍历(字典不允许有相同的key但是可以有相同的object)
NSDictionary *d = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];
方法1:for循环 现获取所有的key放于数组中 在挨个根据key取object
方法2:
[dict enmueratekeysandobjectsusingblock:^(id key,id,obj,bool *stop)
{
nslog(@"%@---%@",key,obj);
}];

集合总结:
1、NSArray\NSMutableArray
*有序
*快速创建@[obj1,obj2,obj3]
*快速访问元素:数组名[i]
****
2、NSSet\NSMutableSet
*无序
*快速创建:
*
3、NSDictionary\NSMutableDictionary
*无序
*快速创建:@{key1:value1,,}
*快速访问元素:字典名[key]

NSArray *persons =@{
@{@"name":@"jack",@"qq":@"79475928"},
@{@"name":@"rose",@"qq":@"794755628"},
@{@"name":@"lee",@"qq":@"794734528"},
@{@"name":@"wong",@"qq":@"79473228"},
}
则:
NSLog(@"%@",person[1][@"qq"]);
取出1位置对应的字典
再取字典中qq这个key对应的数据

NSNumber
OC集合不支持基本数据类型 因此需要进行包装
作用:完成基本数据类型转为对象
NSNumber *num = [NSNumber numberWithInt:10];
对象类型再转换回基本数据类型
int a =[num intValue];

int a= 20;
NSString *s = [NSString stringWithFormat:@"%d",a];
实现将int基本数据类型转换为NSString对象类型

int a = [s intValue]
在实现 将NSString对象数据类型转换为基本数据类型int

@+(数字 字符):自动将数字包装秤一个NSNumber对象

int age =20;
@(age);将int基本数据类型包装成NSNumber

NSValue
NSNumber之所以可以实现包装基本数据类型为对象是因为他继承了NSValue;
NSNumber的缺点是只能包装数字和字符类型的
那么其他基本数据类型将有NSValue来包装
例如将 结构体包装
CGPoint p = CGPointMake(10,10);
NSValue *values = [NSValue valueWithPoint:p];
将value转为对应的结构体
[value pointValue];

NSDate
//创建
NSDate *date = [NSDate date];
//date的默认值是执行上一句时的时间(默认格林尼治时间)
NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date]
date2的时间比date的时间玩5s

NSTimeInterval seconds = [date2 timeIntervalSince1970];
从1970年开始走过的秒数
[date2 timeIntervalSinceNow]//代码执行到现在的时间

日期格式化“
NSDate *date = [NSDate date];
//要想在手机屏幕上显示时间 就必须先把他转换为字符串
日期格式化类
NSDateFormat *formatter = [[NSDateFormatter alloc] init];
日期格式:y年 M 月 d 日 h(12)H(24) 时 m 分 s 秒
formatter.dateFormat = "yyyy-MM-dd hh:mm:ss"

@"2011-09-18"
NSString *str = [formatter stringFromDate:date];

字符串转日期
NSString *time = @"2011\09\10 18:56";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy/MM/dd hh:mm:ss"
NSDate *date = [formatter dateFromString:time];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: