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 操作 实例代码:
//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=;
[mCar print];
[n appendString:@" kingkong"];
[mCar print];
5)浅拷贝与深拷贝的介绍
1、 此两种拷贝是针对数字或字典集合来说的。
2、浅拷贝只拷贝数组对象,两个数组对象存放的是相同元素的地址,数组中的元素对象并没有被拷贝
3、深拷贝 不仅拷贝数组对象,数组中存放的元素对象也将被拷贝一份新的
6)深拷贝与浅拷贝实例代码
NSMutableArray *carList=[[NSMutableArray alloc]init];
for(int i=;i<;i++){
QFCar *car=[[QFCar alloc]init];//自定义的类对象
car.name=[NSString stringWithFormat:@“宝马X%d”,i+];
car.year=+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 文件中的代码实现如下:
#import <Foundation/Foundation.h>
@protocol MasterDelegate<NSObject>
-(void)examine;
-(void)meeting;
-(void)travle;
@end
@interface HeadMaster : NSObject
@property(nonatomic,strong)id<MasterDelegate> delegate;
-(void)masterExamine;
-(void)masterMeeting;
-(void)masterTravle;
@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 ;
}
iOS阶段学习第21天笔记(ARC内存管理-Copy-代理)的更多相关文章
- iOS阶段学习第20天笔记(MRC内存管理)
iOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效 OC中采用 ...
- iOS阶段学习第12天笔记(类的初始化)
iOS学习(OC语言)知识点整理 一.类的初始化 1)init初始化方法(构造方法):一般和alloc一起调用,用于给成员变量初始化. 2)id类型:相当于C中的void*,可以指向任何对象,不能加* ...
- iOS阶段学习第29天笔记(UITextField的介绍)
iOS学习(UI)知识点整理 一.关于UITextField的介绍 1)概念: UITextField 是用于接收用户输入的一个控件 2)UITextField 初始化实例代码: //创建一个UIt ...
- iOS阶段学习第14天笔记(NSString与NSMutableString)
iOS学习(OC语言)知识点整理 一.OC字符串的操作 1)OC中字符串分为两种: 1.不可变字符串NSString:不能修改对象内容,但是可以改变对象的指针. 2.可变字符串NSMutableStr ...
- iOS 阶段学习第11天笔记(OC基础知识)
iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import 用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...
- iOS 阶段学习第七天笔记(函数、递归)
iOS学习(C语言)知识点整理笔记 一.函数 1)概念:具有特定功能的代码块的封装 2)函数的定义: 函数类型+函数名(形参列表) 函数类型 函数名(形参类型1 形参名1,形参类型2 形参名2 ...
- iOS阶段学习第四天笔记(循环)
iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ } 两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...
- iOS阶段学习第三天笔记(运算符)
iOS学习(C语言)知识点整理笔记 1.运算符 一.算术运算符 1)表达式由变量.常量.运算符构成,有确定的类型和值 2)算术运算符包括: +(加),-(减),*(乘),/(除),%(模) 3)算术运 ...
- iOS 阶段学习第四天笔记(循环)
iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ } 两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...
随机推荐
- 安卓手动新增SDK
一:下载SDK 比如,我正要使用sdk5.0,于是我随便找了一个源下载:http://download.csdn.net/detail/dan_seek/8216801 二:整合进eclipse 解压 ...
- 微软承诺将在今年的 Visual C++ 更新中加入 Clang 编译器
微软最近发布将在2015年11月 Visual C++ 更新中加入 Clang 编译器 ,Clang 开源编译器以相比GCC更快的编译速度和更优的错误提示著称. Clang关于C,C++,及Objec ...
- Bootstrap~日期控制
回到目录 一个成熟的框架,日期控制是少不了的,在网上也有很多日期控制可以选择,而主框架用了bootstrap,日期控制也当前要用它自己的, 控件地址:http://www.bootcss.com/p/ ...
- Js~(function(){})匿名自执行方法的作用
匿名自执行方法体(function(){})经常用在设计JS插件上面,它定义相关组件的行为,自动初始化相关属性,而且在页面中可以直接执行,你不需要手动执行它,它被自动被执行! 在设计你的匿名自执行方法 ...
- fir.im Weekly - 17 个提升 iOS 开发效率的必备工具
本期 fir.im Weekly 精选了一些iOS 开发工具和动画源码分享,希望每个开发者能专注效率.实用.灵感. iOS开发工具--如何优化ipa包大小 @iOS程序犭袁 推荐了关于"如 ...
- salesforce 零基础开发入门学习(十)IDE便捷小知识
在这里介绍两个IDE的便捷开发的小知识. 一) 本地调试 由于salesforce代码只能提交以后才能调试,所以很多时候调试代码很麻烦.新版增加了一个特性:即可以在本地调试相关的代码或者查看相关代码运 ...
- Android ListView 进阶学习
1.使用ListView展示数据结构为二维数组的数据 当我们遇到数据结构是二维数组的需求的时候,我们会首先想到ListView,但是要想实现二维数组,会想到ListView里面嵌套ListView,但 ...
- 每天一个linux命令(24):Linux文件类型与扩展名
Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念.我们通过一般应用程序而创建的比如file.txt.file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在Linux文 ...
- 初了解NodeJS
发现了NodeJS以后让我有一种很激动的心情,因为它能做我以前一直想写的东西,而如果没有NodeJS我还需要去学习别的语言,但是有了NodeJS以后就可以通过Javascript来写我的程序了,不得不 ...
- Android线程处理之Handler总结
上一篇为大家介绍了如何通过Handler对象把Message数据发送到主线程,我想大家一定都已经掌握了,本篇我将以一个例子的方式为大家总结一下Handler的使用,例子是通过Handler实现一个图片 ...