黑马程序员——OC学习笔记08 Foundation框架常用的几个结构体和类。

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


一、常用的结构体

NSRange 表示范围成员:都是unsigned long类型的。  location位置,length长度.

定义方式:

1NSRanger1 = {2,4};//可读性不强,一般不用

2NSRanger2 = {.location = 2, .length = 4};//太多余麻烦,一般不用

3NSRanger3 = NSMakeRange(2,4);//定义函数,建议使用。

使用

1NSString里的rangeOfString方法,后字符串在前字符串里的范围。常用

NSRange range = [str rangeOfString:@“love”];

如果找不到上面的字符串,返回值中location NSNotFound.可以用此方法来判断是否找到字符串。

 

 

NSPoint/CGPoint表示点坐标成员:都是double类型的x,y

定义方式同上面一样有定义函数

CGPoint p1 = NSMakePoint(100,200);

CGPoint p2 = CGPointMake(x,y);//最常用的。

CGPoint  NSPoint 是一样的。

CGPointZero 表示原点{00}相当于CGPointZero == CGPointMake(0,0);

Iphone的坐标原点是左上角,正常数学里是左下角。

常用的函数

CGPointEqualToPoint()比较两点。

 

NSSize/CGSize 表示一个UI元素的尺寸成员:宽度width高度height

同样的CGSizeMakeNSMakeSize

也有全是0CGSizeZero

 

 

NSRect/CGRect 表示UI元素的位置(UI的左上角位置)和尺寸成员:CGPoint CGSize

同样的CGRectMakeNSMakeRect

也有其他的定义方式

CGRect r1 = {{0,0},{100,89}};

CGRect r2 = {p1,s1};

 

 

打印结构体成员

1、最麻烦的NSLog(@“”);

2、最简单的把结构体转成NSString来输出

NSStringFromPoint

NSStringFromRange

NSStringFromSize

NSStringFromRect

 

常用的函数

1、比较函数

CG开头的函数都在CoreGraphics框架里,所以要导入框架。fundation只包含了声明,但是实现都在CoreGraphics内。

CGPointEqualToPoint

CGSizeEqualToSize

CGRectEqualToRect

 

2、判断右边的点是否在RECT范围内,返回BOOL

CGRectContainsPoint(rect,point);

 

 

二、NSString NSMutableString

NSString(不可变字符串)对象的创建

1、通过字面量创建

NSString *str = @“Hello World!”;

这种字符串属于常量字符串存在常量区的。

NSString *str2 = @“Hello World!”;

两个常量字符串由于值都是一样的,所以他俩是一样的,他俩指向的地址都是相同的。但是他俩的值只要有一点区别,地址就不一样了。

可以用一下方法测试

NSLog(@“%p %p”,str,str2);用这种方法来输出他们的地址。

 

2、通过初始化方法 这种alloc方式创建的也是堆里的,也要release

NSString *str = [[NSString alloc] init];

NSString *s2 = [[NSString alloc] initWithFormat:@“ageis %d”,10];

C字符串 ->OC字符串

NSString *3 = [[NSString alloc]initWithUTF8String:”jack”];这种一般是转换C字符串。

OC字符串 ->C字符串

const char *c = [s4 UTF8String];

读取文件内容

NSString *s4 =[[NSString alloc]initWithContentOfFile:@“/Users/apple/Desktop/1.txt”encoding:NSUTF8StringEncoding error:nil];其中中文就用NSUTF8StringEncoding这个代码。

 

读取资源内容

URL就是资源路径

格式:协议头://路径

网络HTTP本地file还有ftp 

NSString *s5 = [[NSString alloc]initWithContentsOfURL:(NSURL*) encoding:(NSStringEncoding) error:(NSError*__autoreleasing)];

 

最常见的还是类方法stringWithFormat或者stringWithContentsOfFile等,比ALLOC强的多。

系统自带的对象方法一般都会有一个类方法和对象方法配对。

 

NSUrl也有几个类方法fileURLWithString等。

 

字符串写到文件里

[@“jack” writeToFile:一堆参数];同理URL也有相似的。

 

3、通过类方法创建对象这类字符串是存在堆里面的。

NSString *str = [NSString stringWithFormat:@"今天股票大涨”];

 

int len = [str length];//NSString对象的长度

 

UTF-8编码中,一个中文占3个字节

Cstrlen计算的是字节数

OC里的length计算的是字符串的字符数。

 

两个对象互相做比较时,比较的是他们是不是指向同一个地址,而不是比他们的成员变量。

例如:str1 == str2两个NSString对象。所以不能用if(str1 == str2)

可以用isEqual: isEqualTo: isEqualToString:等方法

[str1 isEqualto:str2];

 

OC里的nil相当于 C里的NULL,可以用来清空对象指针。

 

二、获取字符串的长度

long length = str.length;或者long length = [str length];

获取子串从NSUInteger开始截取(以0开头)

NSString *str2 = [strsubstringFromIndex:(NSUInteger)];

从开头截取到NSUInteger,但不包含索引的字符。

NSString *str3 = [str substringToIndex:(NSUInteger)];

 

NSString *str4 = [str substringWithRange:(NSRange)];

返回一个range范围的字符串

NSRange是一个结构体,开始,长度。

 

获取某个子串在字符串中的区间

NSRange range = [str rangeOfString:@“xxx”];

判断上面是否找到,可以使用用if(range.location == NSNotFound)如果结果为真,则没有找到,结果为NO,就代表找到了。还有一种方法判断range.length== 0,结果为真,就是没找到。

 

把结构体转换成字符串

NSString str5 = NSStringFromRange(range);

 

NSMutableString可变字符串

它继承于NSString,所以他可以用NSString的所有方法。

append是添加 拼接的意思。

s1是一个可变字符串

[s1 appendString:@“12”];//S1后面添加字符串。

[s1 deleteCharacterInRange:(NSRange)];//删除范围内的字符串

获取12的范围,删除12.

NSRange range = [s1 rangOfString:@“12”];

[s1 deleteCharacterInRange:range];

 

s2是不可变字符串

NSString *s3 = [s2stringByAppendingString:@“123”];//创建一个新字符串在S2后面拼接123.

 

 

三、NSArray

OC数组不能存放空值nil

OC数组只能存放OC对象,不能存放非OC对象类型。

 

 

数组类方法

arrayWithObject:

arrayWithObjects://多元素最后一定要放个nil

更快捷的创建数组

NSArray *array = @[@“tim”,@“jack”,@“tim"];

 

对象方法

count

访问方法

[array objectAtIndex:1];

array[1]; //同上

 

NSUInteger a = [array indexOfObject:obj]; //获取位置

遍历数组

1、最普通的就是

for(int i = 0;i < array.count;i++)

 

2、第二种快速遍历

for(id obj in array)//id obj代表着数组中的每个元素,每次运行后都指向下一个元素。

{

}

3、第三种遍历//每遍历一个元素,就会调用block,并且当前元素的索引位置当做参数传递给block

[array enumerateObjectsUsingBlock:^(id obj,NSUIntegeridx,BOOL *stop];

 

小贴士:break只能用在switch语句和循环结构。第三种遍历不能使用break

第三种利用*stop指针来停止遍历。

if(idx == 1) *stop = YES;//YES是停止NO为继续注意  *stop

这里为什么是*stop而不是stop呢?

因为其实enumerateObjectsUsingBlock里面也是一个for循环

for(int i = 0; i < array.count; i++)

{

BOOL isStop = NO;

id obj = array[i];

myblock(obj,i,&isStop);//*stop就是这里,如果不传地址,block内部就无法改变isStop的值。

if(isStop)

{

break;

}

}

那么block内部怎么写的呢?

void (^block)(id,NSUInteger,BOOL) = ^(idobj,NSUInteger idx,BOOL *stop)

{

if(idx == 0)

{

*isStop YES;//只有地址才能传出去影响原来传进来的值。

}

}

 

四、NSSetNSDictionary

NSSet属于无序的数组,相应的,他是不可改变的

对应的也有可变的NSMutableSet可变无序数组

 

类方法setWithObject:

setWithObjects:

 

对象方法

返回随机的对象

anyObject

 

可变的set

类方法继承不可变的set

对象方法

addobject:

removeAllObject

removeObject:(id)

 

数组和SET的共同点

1、都是集合,都能存放OC对象

2、只能存放OC对象,不能存基本数据类型

3、都有一个可变的子类,他们本身是不可变的

 

不同点ARRAY是有序的,SET是无序的。

 

NSDictionary字典

带索引的集合,它是无序的

字典不允许有相同的key但是可以有相同的value

NSDictionary *dic =[NSDictionarydictionaryWithObject:(id) forkey:@""];

最快捷的创建

NSDictionary *dic = @{@"xx":@"value",key:value};

 

最快捷的访问

id obj =dic[@"key"];

 

返回键值的个数

dic.count

 

新建可变字典

NSMutableDictionary *dic =[NSMutableDictionarydictionary];

 

添加键值

[dic setObject:valueforkey:];

如果添加重名的key就会覆盖之前的keyvalue

 

移除键值

removeObjectForKey:();

 

遍历字典

方法1

NSArray *array = [dic allKey];

返回所有的key给一个数组然后通过这个数组遍历。

 

方法2

 *stop ==YES时停止遍历

[dicenumerateKeysAndObjectsUsingBlock:^(id key,idboj,BOOL *stop);

{

NSLog(@"%@= %@",key,obj);

}

遍历一次直接设置*stop = YES,遍历N次可以设置一个累加器,等累加器到N时在设置*STOP = YES;

 

NSDate

NSDate日期类

 

创建时间对象

NSDate *date = [NSDate date]; 返回当前时间默认打印的是格林尼治时间 0 时区。北京是东8 

 

NSDate *date2 = [NSDate dateWithTimeInterval:5sinceDate:date];

返回比date时间晚5秒钟。OC基本是秒单位,不是毫秒。

 

NSTimeInterval seconds = [date2timeIntervalSince1970];返回从1970年到date2的时间之间过了多少秒。

 

[Date2 timeIntervalSinceNow];

 

日期格式化

NSDate *date = [NSDate date];

新建一个日期格式化对象

NSDateFormatter *formatter =[ [NSDateFormatteralloc]init];

制定格式(注意,格式是固定的大小写一定要注意)

 yMd

m分,s秒,H24)时 h12)时

formatter.dateFormat = @“yyyy-MM-dd hh:mm:ss”;

格式化date然后转换成字符串打印出来

NSString *str = [formatter stringFromDate:date];

 

字符串转回NSDate

NSString *time = @“2011/09/10 18:56”;

同样的,新先建立一个格式化对象

NSDateFormatter *formatter = [[NSDateFormatteralloc]init];

formatter.dateFormat = @“yyyy/MM/dd HH:mm”;

最后

NSDate *date = [formatter dateFromString:time];

 

直接打印date会是格林尼治时间。

NSNumberNSValue

NSNumber之所以能够包装基本数据类型为对象,是因为他继承自NSValue.

 

由于所有集合对象都不能存取基本数据类型,如int float等。

这时候我们需要使用NSNumber对象。

 

把一个int转换成NSNumber对象

NSNumber *num = [NSNumber numberWithInt:10];

同理可推敲出其他数据类型的转换方法numberWith开头加上数据类型名

 

这样对象num就可以存入字典dict

 

NSDictionary *dict = @{@“name”:@“jack”,@“age”:num};

 

那么我们取出age的值将会是NSNumber对象

 

NSNumber *num2 = dict[@“age”];

 

NSNumber转回int方法

int i = [num2 intValue];

 

注意字符串NSString也有相同的方法转换成基本数据类型intValue floatValue等。

转来转去很是麻烦。

 

下面是超级快的方法   @

NSDictionary *dict = @{@“name” :@“jack”,@“age” = @20};

没错就是这么方便,使用一个@加数字就转换成了NSNumber对象。 

@后面加很多类型都是转换成什么东西。比如

@“”字符串@[]数组 @{}字典 @25 NSNumber对象。@YES包装BOOL对象。

@’A’这个也是NSNumber对象,基本数据类型要是想放入集合一定要包装成NSNumber对象。

@后面不能直接放基本数据变量,这样它会认为是关键字

要加括号比如 int age = 10; @(age);

 

NSValue一个包装类,不管你是什么类型我都能包装

比如结构体,枚举等。

比如,将结构体包装成对象

CGPoint point = CGPointMake(10,1);

NSValue * value = [NSValue valueWithPoint:point];

几个常用的结构体都有次方法,比如valueWithRect等。

value转回成基本结构体

NSNumber一样,pointValuerectValue


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值