1.Foundation是框架的基础,和UI无关;UIKit是基础的UI类库
2.常用结构体:NSStringFromRange ;NSStringFromPoint;NSStringFromSize;NSStringFromRect;均不是oc对象,存到数组时需转化为NSValue;
3.NSDate:字符串转化为日期时,转化后的日期是字符串的日期-8H;
4.1.NSString:NSString *str2=@"OC string";//ObjC字符串需要加@,并且这种方式创建的对象不需要自己释放内存;
4.2.NSComparisonResult result2= [@"abc" compare:@"aBc"];//如果是[@"abc" caseInsensitiveCompare:@"aBc"]则忽略大小写比较
4.3.NSRange range=[@"abcdefabcdef" rangeOfString:@"cde"];//注意如果遇到cde则不再往后面搜索,如果从后面搜索或其他搜索方式可以设置第二个options参数
4.4.1.文件写入:[str11 writeToFile:path1 atomically:YES encoding:NSUTF8StringEncoding error:&error1];//automically代表一次性写入,如果写到中间出错了最后就全部不写入
4.4.2.路径操作:http://www.cnblogs.com/kenshincui/p/3885689.html
4.5可变字符串:注意虽然initWithCapacity分配字符串大小,但是不是绝对的不可以超过此范围,声明此变量对性能有好处
5.1.[array2 makeObjectsPerformSelector:@selector(showMessage:) withObject:@"Hello,world!"];//执行所有元素的showMessage方法,后面的参数最多只能有一个
5.2.
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"method3:index %zi is %@",idx,obj); if(idx==2){//当idx=2时设置*stop为YES停止遍历 *stop=YES; } }];
5.3.排序:
//方法4 通过描述器定义排序规则 Person *person4=[Person personWithName:@"Jack"]; Person *person5=[Person personWithName:@"Jerry"]; Person *person6=[Person personWithName:@"Tom"]; Person *person7=[Person personWithName:@"Terry"]; NSArray *array6=[NSArray arrayWithObjects:person4,person5,person6,person7, nil]; //定义一个排序描述 NSSortDescriptor *personName=[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; NSSortDescriptor *accountBalance=[NSSortDescriptor sortDescriptorWithKey:@"account.balance" ascending:YES]; NSArray *des=[NSArray arrayWithObjects:personName,accountBalance, nil];//先按照person的name排序再按照account的balance排序 NSArray *array7=[array6 sortedArrayUsingDescriptors:des]; NSLog(@"%@",array7); /*结果: ( "name=Jack", "name=Jerry", "name=Terry", "name=Tom" ) */
6.装箱拆箱:将基本数据类型转化为oc对象成为装箱;反之成为拆箱;NSNumber不能接收结构体,NSValue可以。
6.1.对自定义结构体的装箱拆箱:
typedef struct { int year; int month; int day;} Date;//NSNumber是NSValue的子类,而NSValue可以包装任何类型,包括结构体void test1(){ //如果我们自己定义的结构体包装 Date date={2014,2,28}; char *type=@encode(Date); NSValue *value3=[NSValue value:&date withObjCType:type];//第一参数传递结构体地址,第二个参数传递类型字符串 NSArray *array2=[NSArray arrayWithObject:value3]; NSLog(@"%@",array2); /*结果: ( "" ) */ Date date2; [value3 getValue:&date2];//取出对应的结构体,注意没有返回值 //[value3 objCType]//取出包装内容的类型 NSLog(@"%i,%i,%i",date2.year,date2.month,date2.day); //结果:2014,2,28 }
7.NSNull:我们有时候确实想在数据或字典中存储nil值而不是作为结束标记怎么办呢?这个时候需要使用NSNull,这个类是一个单例,只有一个null方法
8.@作为字面量可以装箱
9.反射:
9.1:[person1 isKindOfClass:[NSObject class]]//判断一个对象是否为某种类型(如果是父类也返回YES)
9.2:[person1 isMemberOfClass:[NSObject class]]//判断一个对象是否是某个类的实例化对象,结果:0
9.3动态生成一个类:
//动态生成一个类 NSString *className=@"Person"; Class myClass=NSClassFromString(className);//根据类名生成类 Person *person2=[[myClass alloc]init]; //实例化 person2.name=@"Kaoru"; NSLog(@"%@",person2);//结果:name=Kaoru //类转化为字符串 NSLog(@"%@,%@",NSStringFromClass(myClass),NSStringFromClass([Person class])); //结果:Person,Person //调用方法 NSString *methodName=@"showMessage:"; SEL mySelector=NSSelectorFromString(methodName); Person *person3=[[myClass alloc]init]; person3.name=@"Rosa"; [person3 performSelector:mySelector withObject:@"Hello,world!"]; //结果:My name is Rosa,the infomation is "Hello,world!". //方法转化为字符串 NSLog(@"%@",NSStringFromSelector(mySelector)); //结果:showMessage:
10.深拷贝&浅拷贝:
retain:始终采取浅复制,引用计数器会加1,返回的对象和被复制对象是同一个对象1(也就是说这个对象的引用多了一个,或者说是指向这个对象的指针多了一个);
copy:对于不可变对象copy采用的是浅复制,引用计数器加1(其实这是编译器进行了优化,既然原来的对象不可变,复制之后的对象也不可变那么就没有必要再重新创建一个对象了);对于可变对象copy采用的是深复制,引用计数器不变(原来的对象是可变,现在要产生一个不可变的当然得重新产生一个对象);
mutablecopy:无论是可变对象还是不可变对象采取的都是深复制,引用计数器不变(如果从一个不可变对象产生一个可变对象自然不用说两个对象绝对不一样肯定是深复制;如果从一个可变对象产生出另一个可变对象,那么当其中一个对象改变自然不希望另一个对象改变,当然也是深复制)。
ObjC引入对象拷贝是为了改变一个对象不影响另一个对象。
字符串字面量由于是一个常量,所以存储在常量区。系统不会对它进行引用计数,所以一直是-1。
11.文件操作:NSFileManager&NSFileHandle,参考:http://www.cnblogs.com/kenshincui/p/3885689.html
12.归档:iOS中数据存储的5种方式:XML属性列表(plist归档);NSUserDefaults(偏好设置);NSKeyedArchiver归档(加密形式);SQLite3(嵌入式数据库);Core Data(面向对象方式的嵌入式数据库)
12.1.XML属性列表(plist归档):只支持数组和字典。
12.2.NSKeyedArchiver归档(加密形式):适合所有ObjC对象,但对于自定义对象需要实现NSCoding协议,并且可以加密归档。