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表达式成立则执行{ }里的语句:双 ...
随机推荐
- OpenCV基于傅里叶变换进行文本的旋转校正
傅里叶变换可以用于将图像从时域转换到频域,对于分行的文本,其频率谱上一定会有一定的特征,当图像旋转时,其频谱也会同步旋转,因此找出这个特征的倾角,就可以将图像旋转校正回去. 先来对原始图像进行一下傅里 ...
- 合法提交Html标签(2)
提交合法的HTML标签(2) 上面用到了一个Inherits属性,它用来设置页面与后台代码中相关联的类.我们打开CodeFile属性所指的文件,会找到该属性所指的类名.但是这里仅仅存放的是用户定义的事 ...
- Atitit attilax总结的对于attilax重要的jsr规范,以及需要增加的jsr规范
Atitit attilax总结的对于attilax重要的jsr规范,以及需要增加的jsr规范 需要增加的jsr规范1 开发常用的10个规范(jsp etc)1 other开发常用的50个规范1 需要 ...
- JS脚本
js脚本是嵌在网页里打出的一块区域,一般写在最下端 script 脚本 // 这是单行注释的一种语法 /**/ 这是多行注释的一种语法 存储内容的东西叫变量 数据类型的有: 1 整型 ...
- Asp.net WebApi 项目示例(增删改查)
1.WebApi是什么 ASP.NET Web API 是一种框架,用于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务.ASP.NET Web API 是一种用于在 .NET ...
- Socket实现仿QQ聊天(可部署于广域网)附源码(1)-简介
1.前言 本次实现的这个聊天工具是我去年c#程序设计课程所写的Socket仿QQ聊天,由于当时候没有自己的服务器,只能在机房局域网内进行测试,最近在腾讯云上买了一台云主机(本人学生党,腾讯云有个学生专 ...
- Zepto中文API
原文地址:http://zeptojs.com/ 译文地址:http://www.html-5.cn/Manual/Zepto/ Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, ...
- Spark入门实战系列--9.Spark图计算GraphX介绍及实例
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理 ...
- AngularJS入门心得1——directive和controller如何通信
粗略地翻了一遍<JavaScript DOM编程艺术>,就以为可以接过AngularJS的一招半式,一个星期过去了,我发现自己还是Too Young,Too Simple!(刚打照面的时候 ...
- Android Fragment完全解析
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8881711 我们都知道,Android上的界面展示都是通过Activity实现的, ...