您所在的位置:小祥子 » 编程 » IOS » 正文

IOS阶段学习第21天笔记(ARC内存管理-Copy-代理)

时间:2015-07-15 编辑:湖南金刚 来源:Cnblogs

IOS学习(OC语言)知识点整理

 

一、OC 中的ARC内存管理  

1)ARC中释放对象的内存原则:看这个对象有没有强引用指向它  

2)strong:强引用,默认情况下的引用都是强引用  

3) weak:弱引用__weak  

4)ARC环境下:与内存相关的代码都不能使用了,如果要在ARC环境下使用MRC内存管理代码 如:

       [super    delloc]  选中项目找到 Build Phases 菜单下的  Compile Sources 项 选中要转换的.m文件, 

       双击写入此行代码:-fno-objc-arc  即可  

5)将MRC代码转换成ARC代码 操作:可以在Xcode 左上角Edit 菜单下的Convert中选择To Objective-C ARC…

      项设置一下即可  

6)如果两个对象的两个指针互相引用,会出现对象的内存无法释放的问题,解决办法:一端用strong,

      一端用weak, 如果是peroperty中的基本类型用assign  

7)ARC 操作 实例代码:  

 //main.m中的代码
 Person *p1=[[Person alloc]init];
 //上一个对象没有强引用指向,内存会被释放掉
 p1=[[Person alloc]init];
 NSLog(@"********");
 //错误的写法,表明有一个弱引用指向对象,这条语句执行完毕后对象就被释放了
 __weak Person *p2=[[Person alloc]init];
 NSLog(@"+++=======");
 
 //Person.h中的代码
 #import <Foundation/Foundation.h>
 @class Card;
 @interface Person : NSObject
 @property(nonatomic,strong)Card *card;
 @property(nonatomic,strong)NSString *name;
 @property(nonatomic,assign)int age;
 @end
 
 //Card.h中的代码
 #import <Foundation/Foundation.h>
 #import "Person.h"
 @interface Card : NSObject
 @property(nonatomic,weak)Person *person;
 @end

二、copy与mutableCopy介绍  

 1)给字符串发送copy消息,得到的是一个不可变字符串(不管是给可变还是不可变字符串发送的消息)  

 2)给字符串发送mutableCopy消息,得到的是一个可变字符串(不管是给可变还是不可变字符串发送的消息)  

 3)字符串对象的copy操作 实例:

 NSString *str1=@"Hello";
 NSString *str2=str1;
 //对不可变字符串发送copy消息会得到一个新的不可变字符串
 NSString *str3=[str1 copy]; 
 // [str3 appendString:@" shanghai"];
 //对不可变字符串发送mutableCopy消息后会得到一个新的可变字符串
 NSMutableString *str4=[str1 mutableCopy];
 [str4 appendString:@" beijing"];
 NSLog(@"str4:%@",str4);
 NSMutableString *mStr1=[NSMutableString stringWithString:str1];
 //对可变字符串发送copy消息会得到一个新的不可变字符串
 NSString *mStr2=[mStr1 copy];
 //[mStr2 appendString:@"aaa"];
 
 //对可变字符串发送mutableCopy消息会得到一个新的可变字符串对象
 NSMutableString *mStr3=[mStr1 mutableCopy];
 [mStr3 appendString:@"abc"];
 NSLog(@"mStr3=%@",mStr3);

4)实现对自定义对象的copy 实例代码:  

  1、定义一个QFCar 类 .h文件中的代码如下: 

 #import <Foundation/Foundation.h> 
 @interface QFCar : NSObject<NSCopying>
 @property(nonatomic,copy)NSString *name;
 @property(nonatomic,assign)int year;
 -(void)print;
 @end

 2、.m文件中的代码如下: 

 #import "QFCar.h" 
 @implementation QFCar
 //调用copy方法时会执行此协议方法
 - (id)copyWithZone:(NSZone *)zone
 {
     //QFCar *car=[[QFCar allocWithZone:zone]init];
    //可以被子类继承,copy出来的就是子类的对象
     //[self class]获取当前的类(对象)
     QFCar *car=[[[self class] allocWithZone:zone]init];
     car.name=self.name;
     car.year=self.year;
     return car;
 }
 
 -(void)print
 {
 
     NSLog(@"name is %@, year is %d",_name,_year);
 }
 @end

3、main 文件中的实现代码: 

 QFCar *mCar=[[QFCar alloc]init];
 NSString *n1=@“宝马X6”;
 NSMutableString *n=[[NSMutableString alloc]initWithString:n1];
 mCar.name=n;
 mCar.year=2015;
 [mCar print];
 [n appendString:@" kingkong"];
 [mCar print];

5)浅拷贝与深拷贝的介绍  

     1、 此两种拷贝是针对数字或字典集合来说的。  

     2、浅拷贝只拷贝数组对象,两个数组对象存放的是相同元素的地址,数组中的元素对象并没有被拷贝   

     3、深拷贝 不仅拷贝数组对象,数组中存放的元素对象也将被拷贝一份新的  

6)深拷贝与浅拷贝实例代码         

 NSMutableArray *carList=[[NSMutableArray alloc]init];
 for(int i=0;i<5;i++){
 QFCar *car=[[QFCar alloc]init];//自定义的类对象
 car.name=[NSString stringWithFormat:@“宝马X%d”,i+1];
 car.year=2011+i;
 [carList addObject:car];
 }
 
  //使用copy(mutableCopy)实现的是数组的浅拷贝(只拷贝数组对象,2个数组对象存放的是相同元素的地址,数组中的元素对象并没有被拷贝)
 //NSMutableArray *array1=[carList mutableCopy];
 
  //浅拷贝
 NSMutableArray *array1=[[NSMutableArray alloc]initWithArray:carList];
 
 //实现数组的深拷贝(不仅拷贝数组对象,数组中存放的元素对象也将被拷贝一份新的)
 NSMutableArray *array2=[[NSMutableArray alloc]initWithArray:carList copyItems:YES];
 [[array2 lastObject] setName:@"shanghai"];
 for(QFCar *car in array2){
 [car print];
 }
 NSLog(@"***********");
 for(QFCar *car in carList){
 [car print];
 }

三、OC 中的代理介绍  

1)代理即自己声明方法自己不实现让别的类或对象去实现的一个过程,代理的目的在于降低代码的耦合性  

2)代理一般都需要有一个协议(protocol)代理方需要遵守协议去实现方法  

3)代理实例代码  

 1、创建两个类对象 HeadMaster(校长类) Teacher(教师类) ;教师类代理校长类的examine、

       meeting、travle 三个方法   

  2、HeadMaster.h 文件中的代码实现如下:  

1 #import <Foundation/Foundation.h> 
 2 @protocol MasterDelegate<NSObject>
 3 -(void)examine;
 5 -(void)meeting;
 7 -(void)travle;
 9 @end
11 @interface HeadMaster : NSObject
13 @property(nonatomic,strong)id<MasterDelegate> delegate;
15 -(void)masterExamine;
17 -(void)masterMeeting;
19 -(void)masterTravle;
21 @end

 

 3、HeadMaster.m 文件中的代码实现如下: 

 #import "HeadMaster.h" 
 @implementation HeadMaster
 -(void)masterExamine
 {
      if([_delegate conformsToProtocol:@protocol(MasterDelegate)]){
         if([_delegate respondsToSelector:@selector(examine)]){
             [_delegate examine];
         }
     }
 } 
 -(void)masterMeeting
 {
     if([_delegate conformsToProtocol:@protocol(MasterDelegate)]){
         if([_delegate respondsToSelector:@selector(meeting)]){
             [_delegate meeting];
         }
     }
 }
 
 -(void)masterTravle
 {
     if([_delegate conformsToProtocol:@protocol(MasterDelegate)]){
         if([_delegate respondsToSelector:@selector(travle)]){
             [_delegate travle];
         }
     }
 }
 @end

 4、Teacher.h文件中的代码实现如下: 

 #import <Foundation/Foundation.h>
 #import "HeadMaster.h"
 @interface Teacher : NSObject<MasterDelegate>
 @end

 5、Teacher.m 文件中的代码实现如下: 

 #import "Teacher.h"
 @implementation Teacher
 -(void)examine
 {
     NSLog(@"teacher examine");
 }
 
 -(void)meeting
 {
     NSLog(@"teacher meeting");
 }
 
 -(void)travle
 {
     NSLog(@"teacher travle");
 }
 @end

6、main.m 文件中的(实现调用)代码 如下: 

 #import <Foundation/Foundation.h>
 #import "Teacher.h"
 int main(int argc, const char * argv[]) {
     @autoreleasepool {
         HeadMaster *master=[[HeadMaster alloc]init];
         Teacher *xiaozhang=[[Teacher alloc]init];
         master.delegate=xiaozhang;
         [master masterExamine];
         [master masterMeeting];
         [master masterTravle];
     }
     return 0;
 }
关键词:IOS 学习 笔记 管理