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-代理)的更多相关文章

  1. iOS阶段学习第20天笔记(MRC内存管理)

    iOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效      OC中采用 ...

  2. iOS阶段学习第12天笔记(类的初始化)

    iOS学习(OC语言)知识点整理 一.类的初始化 1)init初始化方法(构造方法):一般和alloc一起调用,用于给成员变量初始化. 2)id类型:相当于C中的void*,可以指向任何对象,不能加* ...

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

    iOS学习(UI)知识点整理 一.关于UITextField的介绍 1)概念: UITextField 是用于接收用户输入的一个控件 2)UITextField  初始化实例代码: //创建一个UIt ...

  4. iOS阶段学习第14天笔记(NSString与NSMutableString)

    iOS学习(OC语言)知识点整理 一.OC字符串的操作 1)OC中字符串分为两种: 1.不可变字符串NSString:不能修改对象内容,但是可以改变对象的指针. 2.可变字符串NSMutableStr ...

  5. iOS 阶段学习第11天笔记(OC基础知识)

    iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import  用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...

  6. iOS 阶段学习第七天笔记(函数、递归)

     iOS学习(C语言)知识点整理笔记 一.函数 1)概念:具有特定功能的代码块的封装 2)函数的定义: 函数类型+函数名(形参列表) 函数类型 函数名(形参类型1  形参名1,形参类型2   形参名2 ...

  7. iOS阶段学习第四天笔记(循环)

    iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ }  两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...

  8. iOS阶段学习第三天笔记(运算符)

    iOS学习(C语言)知识点整理笔记 1.运算符 一.算术运算符 1)表达式由变量.常量.运算符构成,有确定的类型和值 2)算术运算符包括: +(加),-(减),*(乘),/(除),%(模) 3)算术运 ...

  9. iOS 阶段学习第四天笔记(循环)

    iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ }  两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...

随机推荐

  1. 如何为编程爱好者设计一款好玩的智能硬件(九)——LCD1602点阵字符型液晶显示模块驱动封装(下)

    六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...

  2. 如何在CRM系统中集成ActiveReports最终报表设计器

    有时候,将ActiveReports设计器集成到业务系统中,为用户提供一些自定义的数据表,用户不需要了解如何底层的逻辑关系和后台代码,只需要选择几张关联的数据表,我们会根据用户的选择生成可供用户直接使 ...

  3. PMO到底什么样?(2)

    接上一篇,继续聊一聊PMO到底什么样. 交付功能,8大典型责任 1监控.评定和报告 项目办理单位从交付的视点必定要有监控评定.每个项目在要害的期间上它的进展是不是跟按期的相同:是不是有要害的专家在要害 ...

  4. Java程序员的日常 —— 《编程思想》持有对象

    集合框架可以说是Java里面必备的知识点了,日常的使用中也会遇到各种情况需要使用到集合.下面就简单介绍下各种集合的使用场景: List List可以看做是数组,实现的方式有两种: ArrayList ...

  5. Atitit 图片 验证码生成attilax总结

    Atitit 图片 验证码生成attilax总结 1.1. 图片验证码总结1 1.2. 镂空文字  打散 干扰线 文字扭曲 粘连2 1.1. 图片验证码总结 因此,CAPTCHA在图片验证码这一应用点 ...

  6. JS 脚本最后加载

    有些脚本执行,为了不影响页面其他脚本执行,需要放在最后 <script type="text/javascript"> function addLoadEvent(fu ...

  7. 开始使用MarkDown写博客

    MarkDown 标题 #h1 ##h2 ###h3 h1 h2 h3 代码段 代码段缩进4个空格即可,如下: <div class="form-group"> < ...

  8. 静态(static)代码块、构造代码块、构造函数、父类子类执行顺序

    静态代码块:static修饰的代码块. 在类加载-初始化的时候进行,主要目的是给变量赋予初始值 构造代码块:直接在类中定义且没有加static关键字的代码块称为构造代码块. java会把构造代码块放到 ...

  9. jQuery尺寸算法

    我们默认都统一是采用offsetWidth或者offsetHeight取值了,但我们知道关于这2个尺寸的算法是这样的: offsetWidth = border-left-width + paddin ...

  10. 信息加密之消息摘要算法的MAC

    MAC是消息摘要算法的第三种实现方式,另外两种方式分别为:MD2\4\5.SHA. MAC的jdk实现:1.默认密钥方式 private static void MAC_JDK(){ try { Ke ...