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表达式成立则执行{ }里的语句:双 ...
随机推荐
- linux下目录操作
1. 常用函数 #include <dirent.h> //open a directory //failed-NULL, other-return a DIR stream DIR *o ...
- java 堆栈分析
再次,研究了一个下午的jhat好jmap.从一开始惊呆.懵懂于那样大量而无聊乏味的数据,到现在有那么一点点收货.赶紧记录下来.没办法,悟性太低... C:\Users\Administrator> ...
- Java中常量小知识
常量分类:常量分为静态常量,非静态常量(全局常量),局部常量 静态常量:要么定义的时候赋初值,要么在静态代码块中赋值 非静态常量:要么在定义的时候赋初值,要么在代码块中赋值 局部常量:可以在定义时赋初 ...
- EF架构~关于多对多关系表无法更新与插入的问题
回到目录 在EF里,我们设计模型时,会设计到多对多关系,在EF里会把这种关系会转成两个一对多的关系表,这是比较友好的,因为多对多来说,对于业务本身没什么意思,所以隐藏了,没什么坏处,但对于这个隐藏来说 ...
- 题目一:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
- IDE:Eclipse查看Servlet源码
一.源码下载 1.打开tomcat官网:http://tomcat.apache.org/ , 点击右侧下载菜单(以tomcat-7为例)进入下载页面:http://tomcat.apache. ...
- hdu3339 In Action(Dijkstra+01背包)
/* 题意:有 n 个站点(编号1...n),每一个站点都有一个能量值,为了不让这些能量值连接起来,要用 坦克占领这个站点!已知站点的 之间的距离,每个坦克从0点出发到某一个站点,1 unit dis ...
- java中并不是任意多个接口都可以实现多实现
interface A{ public abstract void show(); } interface B{ public abstract int show(); } public class ...
- 使用bokeh-scala进行数据可视化(2)
目录 前言 几种高级可视化图表 总结 一.前言 之前已经简单介绍过一次如何使用Bokeh-scala进行数据可视化(见使用bokeh-scala进行数据可视化),以及如何在Geotrel ...
- c#方法重载,可选参数,命名参数。
其实这里没什么可说哦,c++的语法大同小异.先看一段代码. class Program { public static void Test(int a) { Console.WriteLine(&qu ...