OC总结

来源:互联网 发布:淘宝背景音乐怎么关 编辑:程序博客网 时间:2024/06/05 15:19
一,类和对象
1.什么是类
同一种对象的抽象就是类
2.什么是对象
世界上的任何事物都可以称为对象,每个对象都有他自己的书选哪个和行为
3.如何创建一个类
.h文件由
@interface 类名:父类
@end 
组成
     1.@interface指引着这个类的名字
     2.interface后面紧跟着这个类的名字,这里是Human
     3.类名后面紧跟着:(冒号),冒号指引着这个类的父类
    4.:后面就是父类的名字,这里是NSObject
   在Interface的下面,我们可以声明全局(这个类的全局)的成员变量,属性,方法
  最后以@end结束
@interface Human:NSObject
//成员变量
{
     int _age; //成员变量年龄
     int_height; //成员变量身高
}
- (void)setAge:(int)newAge;
- (void)setHeight:(int)newHeight;
- (int)getAge;
- (int)getHeight;
@end

#import “Human.h"
@implementation Human
- (void)setAge:(int)newAge{
_age = newAge;
}
- (void)setHeight:(int)newHeight{
_height = newHeight;
}
- (int)getAge{
return _age;
}
- (int)getHeight{
return _height;
}
@end


二.字符串
1.OCSting 转 CString
NSString *string = [NSString alloc] iniwWithCString:@“i am dog” encoding:NSUTF8StringEncoding];

2.字符串比较
NSString *string1 = @“abc”;
NSString *string2 = @“ACD”;
int result = [string1 compare:string2];
//不区分大小写的字符串比较
int result = [str1 compare:str2 options:NSCaseInsensitiveSearch];

3.字符串转大小写
ppercaseString 小写转大写 lowercaseString 大写转小写  capitalizedString首字母大写

4.字符串查询
a.  NSRange range = [string1 rangeOfString:@“cd”]; //调用这个方法的是一个字符串对象变量,参数是想要查找的内容字符串,结果是调用的字符串里面有没有,在哪有
if(range.location == NSNotFound) //如果成功,说明没有
{
NSLog(@“没找着”);
}
else{
NSLog(@“location is %d,length is %d”,range.location,range.length);
}
//NSRange里面有两个变量,一个是位置Index,一个是长度length

b.从后面向前找
NSRange range = [string1 rangeOfString:@“cd” options:NSBackwardsSearch];

c.判断前后缀
BOOL isHave12 = [string1 hasPrefix:@“12”];
BOOL isHave09 = [string1 hasSuffix:@“12”];


5.NSMutableString
appendFormat  insetString:atIndex appendString  deleteCharactersInRange:NSMakeRange(2,3)  setString   replaceCharactersInRange:NSMakeRange(1,2)withString: 



三,数组,字典
数组里面存的是对象指针的集合
分割字符串
NSString *s1 = @“i am a dog”;
NSArray *arr = [s1 componentsSeparetedByString:@“ “];
NSMutableString *s2 = [NSMutabelString stringWithCapacity:0];
for(NSString *temp in arr){
[s2 appendString:temp];
}
同时切很多
NSString *s2 = @“1(22~) 334 34”;
NSArray *arr = [s2 componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@“(~) ”]]; //传入要切的字符集合
NSMutableString *s3 = [NSMutableString stringWithCapacity:0];
       for(int i = 0;i<[telArr count];i++)
       { if([[telArr objectAtIndex:i] isEqualToString:@""] == NO)//因为用set方法切出来的数组里会有垃圾@""的存在,所以需要判断一下每一个索引的内容是否为垃圾@""
           {  [s3 appendString:[telArr objectAtIndex:i]];   }
        }

//数组排序 冒泡
for(int i = 0;i<[arr count]-1;i++){
for(int j = 0;j<[arr count]-1-i;j++){
if([[arr objectAtIndex:j] compare:[arr objectAtIndex:j+1] options:NSCaseInsensitiveSearch] < 0)
{
[arr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
}
} }

将一个NSArray进行排序:将NSArray变为NSMutableArray,将可变数组进行排序 
NSArray *arr = @[“12”,”awe”,”ad”];
NSMutableArray *mutableArr = [NSMutableArray array];
for(int i = 0;i<[arr count];i++){
[mutableArr addObjeect:[arr objectAtIndex:i]];
}
}


四,继承,类别,点语法
self是方法隐藏的参数,存储的是当前的地址 
实例方法中:self的值就是一个对象的指针的值
使用:调用当前类的方法 [self print],  使用property,self.name=@“ya"

super是编译器的指示符,表示父类
用法:执行从父类中继承下来的方法
 

五,封装,复合


六,单例,NSData,文件
单例
1.声明一个全局静态变量 (这个类的对象)
static Sign *single = nil;
@implementation Sign
2.实现+方法
+(id)shareInstance
{3. 做一个局部静态变量 是dispatch_once_t的类型的
 static dispatch_once_t onceTaken;
4. 执行dispatch_once方法,第一个参数是上面的onceTaken的地址,第二个参数是这么写的^{},在大括号里面实现全局静态变量的alloc方法,并在alloc方法后面加分号

dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。
dispatch_once的作用正如其名:对于某个任务执行一次,且只执行一次。 dispatch_once函数有两个参数,第一个参数predicate用来保证执行一次,第二个参数是要执行一次的任务block。

dispatch_once(&onceTaken,^{
   single = [[Sign alloc] init];
  singel.isSign = @“yes”;
});
}
GCD
http://www.dreamingwish.com/article/gcd-guide-dispatch-once-1.html



NSData
数据类,用在本地缓存,网络请求,是一个二进制
1.NSString with NSData
NSString *str = @“in the city”;
NSData *strData = [str dataUsingEncoding:NSUTF8StringEncoding];

2.NSData转化为NSString
NSString *backStr = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];

3.NSArray with NSData
NSArray *arr = [@“1”,@“3”,@“5”];
NSData *arrData = [NSKeyedArchiver archivedDataWithRootObject:arr];

4.NSData 转为NSArray
NSArray *backArr = [NSKeyedUnarchiver unarchiveObjectWithData:arrData];

5.NSDictionary with NSData
NSDictionary *dic = @{@“1”:@“A”,@“2”:@“B”,@“3”:@“C”};
//创建一个可变Data
NSMutableData *dicData = [[NSMutableData alloc] init];
//把这个可变data加入到一个归档中,作为被写入的对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:dicData];
//进行归档操作,把dic转存进data中,使用对象-key的方法,key是为了以后能找到某一个确定对象用的,这里可以用不同的key存很多个对象 (参考可变字典setValue:ForKey:)
[archiver encodeObject:dic forKey:@“dic”];
//归档结束
[archiver finishEncoding];


6.把NSData转化NSDictionary
//创建一个解归档的对象,这个对象初始化从一个NSData里面读数据
NSKeyedUnarchiver *unArchier = [[NSKeyedUnarchiver alloc] initForReadingWithData:dicData];
//使用这个解归档的对象来把data根据key找出对应的对象转回dic
NSDictonary *backDic = [unArchier decodeObjectForKey:@“dic”];
//结束解归档
[unArchier finishDecoding];


文件操作方法
//使用单例创建一个文件管理器的对象,defaultManager就是一个单例方法
NSFileManager *fm = [NSFileManager defaultManager];
//创建文件,一般来说先要判断文件是否存在
/Users/yanwei/Desktop/是11.txt的路径
//路径后面跟一个文件名,文件名要加上扩展名
BOOL ifExist = [fm fileExistsAtPath:@“/Users/yuanwei/Desktop/11.txr”];

当bool值为NO的时候,创建一个新的文件
if(ifExist == NO){
//第一个参数就是想创建的文件的路径,路径里面要包括即将创建的文件的名字和扩展名
BOOL ifCreateSuccess = [fm createFilePath:@“/User/yuanwei/Desktop/11.tex” contents:nil attributes:nil];

//创建一个目录,第一参数是路径
BOOL isPathSuccess = [fm createDirectoryAtPath:@“/Users/yuanwei/Desktop/123/456” withIntermediateDirectories:YES attributes:nil error:nil];

获取文件大小的方法
NSDictionary *fileDic = [fm attributesOfItemAtPath:@“/Users/yuanwei/Desktop/11.txt” error:nil];
long long size = [fileDic fileSize];

遍历文件夹
//错误信息的对象,很多方法都会把这个对象的地址传进去,当某一个地方执行时出现问题了,就可以打印这个error
NSError *error = nil;
//浅层遍历,只遍历我们给定的路径这个文件夹的根目录,error参数传的是地址,要加&
NSArray *shallowArr = [fm contentsOfDirectoryAtPath:@“/User/yuanwei/Desktop” error:&error];
if(error) { NSLog(@“%@“,error); }
else {
//找文件类型,原理就是遍历上面数组,判断扩展名
for(NSString *fileName in shallower){
if ([fileName hasSuffix:@“.txt]){
NSLog(@“%@“,fileName);
}
}}
//深层遍历,遍历我们给定路径文件夹的文件以及其子目录下的文件
//把遍历出来的文件存到数组中
NSArray *deepArr = [fm subpathsOfDirectoryAtPath:@“/Users/yuanwei/Desktop/123” error:&error];
if(error){
NSLog(@“%@“,error);
} else {
NSLog(@“%@“,deepArr);
}


文件的复制和移动
NSArray *fileArr = [fm contentsOfDirectoryAtPath:@“/Users/yuanwei/Desktop/123/456” error:&error];
if(error) {
NSLog(@“%@“,error);
}
else
{NSLog(@“%@“,fileArr);
}
//文件路径
NSString *filePath = [NSString stringWithFormat:@“/Users/yuanwie/Desktop/123/456/%@“,@“11.txt”];
//文件目的路径
NSString *toPath = [NSString stringWithFormat:@“/Users/yuanwei/Desktop/123/%@“,@“11.txt”];
//复制
BOOL isCopySuccess = [fm copyItemAtPath:filePath toPath:toPath error:&error];
if(isCopySuccess){
NSLog(@“成功”); }
else{
NSLog(@“失败%@“,error);
}
//移动
BOOL isMoveSuccess = [fm moveItemAtPath:filePath toPath:toPath error:&error];
if(isMoveSuccess){
NSLog(@“成功”);
}
else{
NSLog(@“失败%@“,error);
}

//以上内容是文件的操作,都要用到NSFileManager的单例对象


文件内容操作方法
//文件的内容的读写操作
//打开一个文件,会只读,只写,读写的三种方法
//操作文件内容的类是NSFileHandle *file = [NSFileHandle fileHandleForUpdatingAtPath:@“/Users/yuanwei/Desktop/123/11.txt”];  
//fileHandleForUpdatingAtPath是读写
//打开以后我们的文件偏移量在开始(光标),偏移量是0
 NSData *fileData = [file readDataOfLength:1]; //读几个字节
NSString *fileStr = [[NSString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];

//读了一次之后,咱们的文件偏移量就到了上次读过的下一个位置了
NSData *fileData2 = [file readDataToEndOfFile];
NSString *fileStr2 = [[NSString alloc] initWithData:fileData2 encoding:NSUTF8StringEncoding];


//偏移量现在已经到了末尾了
//写文件内容
NSString *string1 = @“1234567”;
NSData *string1Data = [ string1 dataUsingEncoding:NSUTF8StringEncoding]; 
//转str到dara
[file writeData:string1Data];


//现在偏移量在最后
//移动偏移量光标到最开始
[file seekToFileOffset:0];

NSString *string2 = @“@$@#^$#%#”;
NSData *string2Data = [string2 dataUsingEncoding:NSUTF8StringEncoding];  //转str到data
[file writeData:string2Data];



Plist,归档(字典)
1.Plist文件的创建
2.Plist文件的类型以及每一级的类型
3.如何把一个plist文件读写出来
//从一个内容为字典的plist文件中取回字典的内容
NSDictonary *stringPlistDic = [NSDictonary dictonaryWithContentsOfFile:@“/Users/yuanwei/Desktop/Plist/Plist/String.plist”];
//打印name这个KEY的value 
NSLog(@“%@“,[stringPlistDic objectForKey:@“name”]);

NSArray *stringPlistArr = [NSArray arrayWithContentsOfFile:@“/Users/yuanwei/Desktop/Plist/Plist/Arr.plist”];


*如何把一个字典赋值给一个类的所有属性
1.系统对象归档
NSString *info = @“abcdefg”;
NSArray *arr = [[NSArray alloc] initWithObjects:@“ab”,@“cd”,@“ed”,nil];

对象归档archiver
//NSKeyesArchiver 专门用于对象归档的类
第二个参数,应该填入一个归档文件的路径
NSString *path = @“/Users/yuanwei/Desktop/info.data”;
BOOL b = [NSKeyedArchiver archiveRootObject:info toFile:path];
if(b){
NSLog(@“archiver OK”); }

2.把对象从归档文件中读取出来 - 解档
NSString *readInfo = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

3.自定义对象的归档和解档
Dog *dog = [[Dog alloc] init];
dog.name = @“coffee”;
dog.age = 3;

把这个狗 - 归档
NSString *path = @“/Users/yuanwei/Desktop/dog.data”;
[NSKeyedArchiver archiveRootObject:dog toFile:path];

系统的对象为什么能直接归档?
想让自己定义的对象支持归档和解档,需要做2件事:
1.遵守NSCoding协议
2.实现协议中的2个方法
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;

从文件中解档出来这条狗
Dog *newDog = [NSKeyedUnarchiver unarchiveObjectWithFile:path];



协议,NSDate

1.创建一个协议
@protocol Work <NSObject>
-(void)drink;
@end
2.协议分类
@required (默认)
@optional 
3.遵守一个协议
#import “Work.h” 包含协议的头文件
#import “Play.h"
@interface Test : NSObject<Work,Play>
-(void)drink{
}




内存管理
1.用一句话说内存管理是什么:
OC的内存管理,管理的是内存的引用计数(retainCount)

2.内存管理怎么管的
OC的内存管理分为2种:1种是手动内存管理(MRC),1种是自动内存管理(ARC)

3.内存管理的体现是什么
任何一个对象都可以调用retainCount方法来查看其他目前的引用计数,当更多还是要脑算
现在str所指向的内存当然使用了alloc的时候,每次引用计数+1,所以现在str所指向的内存的引用计数是1
当对一个对象进行了retain操作以后,这个对象指向的内存的引用计数会+1,所以现在str指向的内存的引用计数是2
当一个对象指针所指向的内存空间的引用计数大于0 时,我们认为这块内存是可以被引用的
当一个对象指针所指向的内存空间的引用计数等于0之后,这块内存空间就会自动调用他的dealloc方法进行释放 
当使用alloc,copy,new,retain这些方法的时候,一块内存的引用计数会进行+1操作
当使用release操作的时候,一块内存的引用计数会进行-1操作



4.内存管理的注意事项
不要直接调用[对象 dealloc];
release和dealloc有什么区别,哪个释放内存:
/* release和内存释放没有直接关系,release的工作是计数-1
   dealloc才是释放内存,计数为0的时候自动调用
*/



代理
代理有一个触发类和一个接受类 
如何创建一个触发类(协议、属性、方法)
如何实现一个触发类(方法、属性调用协议方法)
如何创建一个接受类
如何实现一个接受类
接受类是如何与触发类联系的,需要注意什么(修饰符)







转载自:http://www.cnblogs.com/jxk-xtt/p/4988955.html













0 0
原创粉丝点击