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

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 操作 实例代码:

 1 //main.m中的代码
 2 Person *p1=[[Person alloc]init];
 3 //上一个对象没有强引用指向,内存会被释放掉
 4 p1=[[Person alloc]init];
 5 NSLog(@"********");
 6 //错误的写法,表明有一个弱引用指向对象,这条语句执行完毕后对象就被释放了
 7 __weak Person *p2=[[Person alloc]init];
 8 NSLog(@"+++=======");
 9
10 //Person.h中的代码
11 #import <Foundation/Foundation.h>
12 @class Card;
13 @interface Person : NSObject
14 @property(nonatomic,strong)Card *card;
15 @property(nonatomic,strong)NSString *name;
16 @property(nonatomic,assign)int age;
17 @end
18
19 //Card.h中的代码
20 #import <Foundation/Foundation.h>
21 #import "Person.h"
22 @interface Card : NSObject
23 @property(nonatomic,weak)Person *person;
24 @end

二、copy与mutableCopy介绍

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

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

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

 1 NSString *str1=@"Hello";
 2 NSString *str2=str1;
 3 //对不可变字符串发送copy消息会得到一个新的不可变字符串
 4 NSString *str3=[str1 copy];
 5 // [str3 appendString:@" shanghai"];
 6 //对不可变字符串发送mutableCopy消息后会得到一个新的可变字符串
 7 NSMutableString *str4=[str1 mutableCopy];
 8 [str4 appendString:@" beijing"];
 9 NSLog(@"str4:%@",str4);
10 NSMutableString *mStr1=[NSMutableString stringWithString:str1];
11 //对可变字符串发送copy消息会得到一个新的不可变字符串
12 NSString *mStr2=[mStr1 copy];
13 //[mStr2 appendString:@"aaa"];
14
15 //对可变字符串发送mutableCopy消息会得到一个新的可变字符串对象
16 NSMutableString *mStr3=[mStr1 mutableCopy];
17 [mStr3 appendString:@"abc"];
18 NSLog(@"mStr3=%@",mStr3);

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

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

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

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

 1 #import "QFCar.h"
 2 @implementation QFCar
 3 //调用copy方法时会执行此协议方法
 4 - (id)copyWithZone:(NSZone *)zone
 5 {
 6     //QFCar *car=[[QFCar allocWithZone:zone]init];
 7    //可以被子类继承,copy出来的就是子类的对象
 8     //[self class]获取当前的类(对象)
 9     QFCar *car=[[[self class] allocWithZone:zone]init];
10     car.name=self.name;
11     car.year=self.year;
12     return car;
13 }
14
15 -(void)print
16 {
17
18     NSLog(@"name is %@, year is %d",_name,_year);
19 }
20 @end

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

1 QFCar *mCar=[[QFCar alloc]init];
2 NSString *n1=@“宝马X6”;
3 NSMutableString *n=[[NSMutableString alloc]initWithString:n1];
4 mCar.name=n;
5 mCar.year=2015;
6 [mCar print];
7 [n appendString:@" kingkong"];
8 [mCar print];

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

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

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

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

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

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

三、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 文件中的代码实现如下:

 1 #import "HeadMaster.h"
 2 @implementation HeadMaster
 3 -(void)masterExamine
 4 {
 5      if([_delegate conformsToProtocol:@protocol(MasterDelegate)]){
 6         if([_delegate respondsToSelector:@selector(examine)]){
 7             [_delegate examine];
 8         }
 9     }
10 }
12 -(void)masterMeeting
13 {
14     if([_delegate conformsToProtocol:@protocol(MasterDelegate)]){
15         if([_delegate respondsToSelector:@selector(meeting)]){
16             [_delegate meeting];
17         }
18     }
19 }
20
21 -(void)masterTravle
22 {
23     if([_delegate conformsToProtocol:@protocol(MasterDelegate)]){
24         if([_delegate respondsToSelector:@selector(travle)]){
25             [_delegate travle];
26         }
27     }
28 }
29 @end

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

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

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

 1 #import "Teacher.h"
 2 @implementation Teacher
 3 -(void)examine
 4 {
 5     NSLog(@"teacher examine");
 6 }
 7
 8 -(void)meeting
 9 {
10     NSLog(@"teacher meeting");
11 }
12
13 -(void)travle
14 {
15     NSLog(@"teacher travle");
16 }
17 @end

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

 1 #import <Foundation/Foundation.h>
 2 #import "Teacher.h"
 3 int main(int argc, const char * argv[]) {
 4     @autoreleasepool {
 5         HeadMaster *master=[[HeadMaster alloc]init];
 6         Teacher *xiaozhang=[[Teacher alloc]init];
 7         master.delegate=xiaozhang;
 8         [master masterExamine];
 9         [master masterMeeting];
10         [master masterTravle];
11     }
12     return 0;
13 }
时间: 2024-11-08 22:24:01

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

IOS阶段学习第20天笔记(OC中的内存管理)

IOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效      OC中采用引用计数器对内存做管理,他是一个整数数据,表示对象引用的次数,每个对象分配4字节      的内存空间存放引用计数器.当一个对象的引用计数器为0时 它将被自动释放,反过来说 当使用alloc.      new .copy(mutableCopy)创建新对象时,引用计数器默认为1 2)黄金法则 当使

IOS阶段学习第四天笔记(循环)

    IOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ }  两种 2.单分支 if表达式成立则执行{ }里的语句:双分支 if表达式不成立 则执行else{ }里面的语句 3.字符串的输出系统会从数组地址一直打印到字符 ‘\0’为止,如果没有正确初始化,可能会打印出数组外的信息 4.如果分支结构里面只有一条执行语句可省略外面的大括号{} . 二.开关语句 1.语句结构 :switch (参数) case

IOS阶段学习第三天笔记(运算符)

                                         IOS学习(C语言)知识点整理笔记 1.运算符 一.算术运算符 1)表达式由变量.常量.运算符构成,有确定的类型和值 2)算术运算符包括: +(加),-(减),*(乘),/(除),%(模) 3)算术运算符优先级 括号()> * ,/ ,%  >+,- 4)%表示取余.取模  a%b 表示a除以b取余数 5)整数相除保留两位小数处理方法如: printf(“%.2f”,(float)14/9); 6)自增自减运算符

IOS 阶段学习第24天笔记(Block的介绍)

IOS学习(OC语言)知识点整理 一.Block 的介绍 1)概念: block 是一种数据类型,类似于C语言中没有名字的函数,可以接收参数,也可以返回值与C函数一样被调用 封装一段代码 可以在任何地方调用 block 也可以作为函数参数,以及函数返回值 2)Block 实例代码 1 //定义了一个block类型MyBlock,MyBlock类型的变量只能指向带两个int的参数和返回int的代码块 2 typedef int (^MyBlock)(int,int); 3 //定义一个函数指针 4

IOS 阶段学习第23天笔记(XML数据格式介绍)

IOS学习(OC语言)知识点整理 一.XML数据格式介绍 1)概念:xml是extensible markup language扩展的标记语言,一般用来表示.传输和存储数据 2)xml与json目前使用比较广泛的两种网络传输数据格式 两者分别占比: 1. json:市场上占90%,轻量级的表示数据 2.xml:占10%,表示数据比较复杂 3)XML三种数据解析方法: 1.DOM解析:将整个xml数据加载到内存中,构造一个对象,从根结点开始一级一级的解析提取数据.缺点:如果数据大, 比较占内存,解

IOS阶段学习第18天笔记(归档与解归档操作)

IOS学习(OC语言)知识点整理 一.归档与解归档的操作 1)归档是一个过程,将一个或多个对象存储起来,以便以后可以还原,包括将对象存入文件,以后再读取 将数据对象归档成plist文件 2)plist文件中只能存放:NSString.NSDate.NSNumber.Bool.NSData.NSArray.NSDictionary 并且NSArray和NSDictionary中只能是以上的类型 3)归档存放时数据是什么类型,读取数据时就用什么类型的数据接收. 4)归档不能直接操作自定义对象类型的数

IOS 阶段学习第十天笔记(字符串操作)

IOS学习(C语言)知识点整理 一.字符串的操作 1)字符串的存储,字符数组,在堆里面申请内存空间. 实例代码: #include <stdlib.h> #include <string.h> int main(){ char str[100] = "hello world"; char *p = "hello world"; //*p ='H';//常量字符串不可以修改,p指向只读的地址 p = str; *p = 'H'; // prin

IOS阶段学习第16天笔记(Category、NSSet、NSIndexSet的操作)

IOS学习(OC语言)知识点整理 一.NSSet.NSMutableSet集合的介绍 1)NSSet.NSMutableSet集合,元素是无序的,不能有重复的值. 2)用实例方法创建一个不可变集合对象 例如: //宏定义 #define TOBJ(n) [NSNumber numberWithInt:n] NSSet *set1=[[NSSet alloc]initWithObjects:TOBJ(2),TOBJ(3),TOBJ(3),TOBJ(1),TOBJ(5), nil]; 2)用类方法创

iOS阶段学习第29天笔记(UITextField的介绍)

iOS学习(UI)知识点整理 一.关于UITextField的介绍 1)概念: UITextField 是用于接收用户输入的一个控件 2)UITextField  初始化实例代码: 1 //创建一个UItextField实例 2 UITextField *textField = [[UITextField alloc] init]; 3 textField.frame = CGRectMake(10, 40, self.view.frame.size.width - 20, 40); 4 tex