------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、常用的结构体
NSRange 表示范围成员:都是unsigned long类型的。 location位置,length长度.
定义方式:
1、NSRanger1 = {2,4};//可读性不强,一般不用
2、NSRanger2 = {.location = 2, .length = 4};//太多余麻烦,一般不用
3、NSRanger3 = NSMakeRange(2,4);//定义函数,建议使用。
使用
1、NSString里的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 表示原点{0,0}相当于CGPointZero == CGPointMake(0,0);
Iphone的坐标原点是左上角,正常数学里是左下角。
常用的函数
CGPointEqualToPoint()比较两点。
NSSize/CGSize 表示一个UI元素的尺寸成员:宽度width高度height
同样的CGSizeMake和NSMakeSize
也有全是0的CGSizeZero
NSRect/CGRect 表示UI元素的位置(UI的左上角位置)和尺寸成员:CGPoint CGSize
同样的CGRectMake和NSMakeRect
也有其他的定义方式
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个字节
C中strlen计算的是字节数
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;//只有地址才能传出去影响原来传进来的值。
}
}
四、NSSet和NSDictionary
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就会覆盖之前的key和value
移除键值
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];
制定格式(注意,格式是固定的大小写一定要注意)
y年M月d日
m分,s秒,H(24)时 h(12)时
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会是格林尼治时间。
六 、NSNumber和NSValue
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