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. 使用Chef管理windows集群

    但凡服务器上了一定规模(百台以上),普通的ssh登录管理的模式就越来越举步维艰.试想Linux发布了一个高危漏洞的补丁,你要把手下成百上千台机器都更新该补丁,如果没有一种自动化方式,那么至少要耗上大半 ...

  2. JS图片懒加载

    简介 当页面图片太多时,加载速度就会很慢.尤其是用2G/3G/4G访问页面,不仅页面慢,而且还会用掉很多流量.图片懒加载的原理就是将页面内所有需要加载的图片全部换成一张默认的图片(一般尺寸很小),只有 ...

  3. 第三天 vi编辑器使用和软件安装

    [复习] 判断题: 查看某文件权限为rwxr-xr-- ,则其所属组权限为只读. 对一个目录有w权限,表示可以修改目录下文件内容. 3..tar.gz格式的压缩包可以使用tar -xjf解压缩 4.m ...

  4. iOS----CocoaPods的安装、使用和,原理+参考流程+常见问题

    一.什么是CocoaPods CocoaPods是iOS项目的依赖管理工具,该项目源码在Github上管理.开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和第 ...

  5. Maven Myeclipse 搭建项目

    一.maven概述 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具! 简单说Maven 是一个项目管理和构建自动化工具 二.环境搭建 1. ...

  6. java 面向对象

    Java语言是纯粹的面向对象的程序设计语言,这主要表现为Java完全支持面向对象的三种基本特征:继承.封装和多态.Java语言完全以对象为中心,Java程序的最小程序单位是类,整个Java程序由一个一 ...

  7. Packet for query is too large(1767212 > 1048576)mysql在存储图片时提示图片过大

    原网址:http://blog.csdn.net/bigbird2012/article/details/6304417 错误现象:Packet for query is too large(1767 ...

  8. 清空文件下的SVN控制文件

    代码如下,复制代码为txt文件,更改后缀为“.bat”,把文件放到,需要删除的文件的顶端文件夹内,点击执行. @echo on color 2f mode con: cols= lines= @REM ...

  9. 邻接表无向图(三)之 Java详解

    前面分别介绍了邻接表无向图的C和C++实现,本文通过Java实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http:/ ...

  10. Mybatis之Oracle增删查改示例--转

    http://blog.csdn.net/bingjie1217/article/details/21088431?utm_source=tuicool&utm_medium=referral ...