八.OC基础加强--1.autorelease的用法 2.ARC下内存管理 3.分类(category)4.block的学习
1.autorelease的用法
1、自动释放池及autorelease介绍
(1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的。
(2)当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中 。
2、为什么会有autorelease?
OC的内存管理机制中比较重要的一条规律是:谁申请,谁释放。
但有些情况下,开发者并不能确定某些对象何时释放。这时候就需要自动释放池。
它的好处是:
(1)不需要再关心对象释放的时间 ;
(2)不需要再关心什么时候调用release ;
3,autorelease的使用注意:
(1),只有在自动释放池中调用了autorelease方法的对象,才会被放进池子里面;
(2),自动释放池中不适宜放占用内存比较大的对象,尽量避免对大内存使用该方法,对于这种延迟释放机制,还是尽量少用 ;
(3),不要把大量循环操作放到同一个 @autoreleasepool 之间,这样会造成内存峰值的上升 ;
(4),池子释放的时候,只会对它里面的对象做一次release操作。
2.ARC下内存管理
1,ARC介绍及入门
1, Automatic Reference Counting,自动引用计数,即ARC。
2、指针分类
(1)强指针:默认的情况下,所有的指针都是强指针,关键字strong
(2)弱指针:_ _weak关键字修饰的指针
声明一个弱指针如下:
_ _weak Person *p;
3、ARC工作原理及判断准则 :
ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autorelease。
4,ARC的判断准则:
只要还有一个强指针变量指向对象,对象就会保持在内存中。
只要没有强指针指向对象,对象就会被释放。
注意:当使用ARC的时候,暂时忘记“引用计数器”,因为判断标准变了
2,ARC对象管理
总结:
1,当栈区的指向对象的局部变量随着代码块的结束,而被释放;那么,对象就没有了强指针引用了,所以也被释放。
2,当对象被指定为__week的弱指针时,对象也被释放。
ARC下循环引用:
解决方案:循环引入的对象中其中一个对象设置为strong ,另一个设置为weak
ARC下@property参数
strong : 用于OC对象, 相当于MRC中的retain
weak : 用于OC对象, 相当于MRC中的assign
assign : 用于基本数据类型, 跟MRC中的assign一样
copy : 一般用于NSString, 跟MRC中的copy一样
在ARC情况下解决”循环retain”的问题:
@property一边用strong,一边用weak。
3,ARC使用注意
1、ARC特点总结
(1)不允许调用release,retain,retainCount
(2)允许重写dealloc,但是不允许调用[super dealloc]
(3)@property的参数:
strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针
assign:适用于非OC对象类型(基础类型)
2、ARC使用注意事项
1)ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作。
2)__weak Person *p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针设置为nil。
3)ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc]。
@property(nonatomic,strong)Dog *dog;
// 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。
4)如果换成是弱指针,则换成weak,不需要加_ _。
3、ARC模式下如何兼容非ARC的类 :转变为ARC的, -f-objc-arc
非ARC模式下如何兼容ARC的类 :转变为非ARC -fno-objc-arc
4,将MRC转换为ARC
其实就是将一些代码删掉。
3.分类(category)
1,category概念介绍
一、Category有很多种翻译: 分类 \ 类别 \ 类目 (一般叫分类)
Category是OC特有的语法;
二、类别的作用 :
在不修改原有的类的基础上增加新的方法
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作
三、使用类别的目的
1)对现有类进行扩展:
比如,你可以扩展Cocoa touch框架中的类,你在类别中增加的方法会被子类所继承,而且在运行时跟其他的方法没有区别。
2)作为子类的替代手段: 不需要定义和使用一个子类,你可以通过类别直接向已有的类里增加方法。
3)对类中的方法归类: 利用category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方法进行更新和维护。
2,category使用
一、声明和实现一个类别
1、在.h文件中,声明类别:
@interface ClassName (CategoryName)
NewMethod; //在类别中添加方法 ,不允许在类别中添加变量
@end
说明:
声明类别格式
1)新添加的方法必须写在 @interface 与@end之间
2)ClassName 现有类的类名(要为哪个类扩展方法)
3)CategoryName 待声明的类别名称
4)NewMethod 新添加的方法
2、在.m文件中(也可以在.h中实现),实现类别:
@implementation ClassName(CategoryName)
NewMethod
@end
说明:
实现类别格式
1)新方法的实现必须写在@implementation与@end之间
2)ClassName 现有类的类名
3)CategoryName 待声明的类别名称
4)NewMethod 新添加的方法的实现
二、分类的使用注意:
1)分类只能增加方法, 不能增加成员变量、@property(可能编译不报错,但是运行有问题)
2)分类可以访问原来类中的成员变量
3)如果分类和原来类出现同名的方法, 优先调用分类中的方法, 原来类中的方法会被忽略
举例:现在我们有一个类叫MyClass,
它有一个实例方法:myPrint,待会我们可以在扩展后调用它.我们要在不增加子类,不修改MyClass类的情况下增加一个HelloWorld的方法
1.command+n新建文件
2.Class的类是MyClass,选对了哦
这样Xcode就帮你创建了MyClass+HelloWorld.h 和 MyClass+HelloWorld.m这两个 文件了。
3.那么我们现在添加一个HelloWorld方法。看看实现后的代码如下:
那的Category的使用场景有那些呢:
1、类包含了很多个方法实现,而这些方法需要不同团队的成员来实现
2、当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。
Category能实现上面的需求,当然也有使用Category是需要注意的问题:
1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
2、Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。
3.非正式协议
非正式协议就是给NSObject类创建的类目(分类)叫做非正式协议, 非正式协议一般不需要进行实现,一般在子类中进行方法的重写。
4.延展:匿名的类目;
主要的使用意义是在类的.m文件中定义类的私有;
//延展的声明 //类目的声明
@interface Student () @interface Student(Creation)
@end @end
延展中定义的方法不能被继承也不能被子类访问;
4.block的学习
1,block简单介绍
block的基本概念
Block对象是一个C级别的语法和运行机制。它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆、栈内存绑定的变量。
因此,Block对象包含着一组状态数据, 这些数据在程序执行时用于对行为产生影响。
你可以用Block来写一些可以传到API中的函数语句,可选择性地存储,并可以使用多线程。 作为一个回调,Block特别的有用,
因为block既包含了回调期间的代码,又包含了执行期间需要 的数据。
由于Objective-C 和 C++ 都是衍生自 C,block被设计为可同时兼容这三种语言。
2,block具体用法
1) block最简单形式
定义格式:
void (^block名)() = ^{代码块;}
使用格式:
block名();
2) block带有参数的block的定义和使用
格式:
void (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; }
3) 带有参数和返回值的block
格式:
返回类型 (^block名称)(参数列表)
= ^ 返回类型 (参数列表) { // 代码实现; }
4)利用typedef定义block类型(和指向函数的指针很像)
格式:
typedef 返回值类型 (^block变量名)(参数类型列表);
3.block使用注意
1)在block内部可以访问block外部的变量 ;
2)在block内部不可以修改block外部的变量
默认情况下,Block内部不能修改外部的局部变量 ;
3)给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。
八.OC基础加强--1.autorelease的用法 2.ARC下内存管理 3.分类(category)4.block的学习的更多相关文章
- 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理
1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...
- oc语言--内存管理
一.基本原理 1.什么是内存管理 1> 移动设备的内存及其有限,每个app所能占用的内存是有限制的 2> 当app所占用的内存较多时,系统就会发出内存警告,这是需要回收一些不需要的内存空间 ...
- OC开发系列-内存管理
概述 移动设备的内存极其有限,每个app所有占用的内存是有限的.当app所占用的内存比较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间. 任何集成了NSObject的对象都需要手动进行 ...
- OC中的属性、方法及内存管理
普通方法:关注(代表)对象可以”干什么”,过程中需要实例变量.-(void)show;输出 … 访问属性 属性:属性专门处理实例变量.(程序执行过程当中) 初始化方法:一创建对象(第一时间 ...
- OC基础笔记目录
OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...
- oc 基础知识
一.枚举 结构体 typedef enum{ sexMan, sexWoman }Sex; tydedef struct{ int year; int month; int da ...
- oc总结 --oc基础语法相关知识
m是OC源文件扩展名,入口点也是main函数,第一个OC程序: #import <Foundation/Foundation.h> int main(int argc, const cha ...
- OC总结 【OC基础语法相关知识】
m是OC源文件扩展名,入口点也是main函数,第一个OC程序: #import <Foundation/Foundation.h> int main(int argc, const cha ...
- iOS开发——OC基础-ARC、BLOCK、协议
一.ARC ARC 是一种编译器特性!而不是IOS运行时特性,和JAVA中得垃圾回收机制完全不一样ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的 ...
随机推荐
- PatentTips - Solid State Disk (SSD) Device
BACKGROUND OF THE INVENTION A SSD apparatus is a large-capacity data storage device using a nonvolat ...
- Python()- 面向对象三大特性----继承
继承: 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类(基类或超类),新建的类是所继承的类的(派生类或子类) 人类和狗 有相同的属性, 提取了一个__init__方法,在这 ...
- poj3694+hdu2460 求桥+缩点+LCA/tarjan
这个题使我更深理解了TARJAN算法,题意:无向图,每添加一条边后文桥的数量,三种解法:(按时间顺序),1,暴力,每每求桥,听说这样能过,我没过,用的hash判重,这次有俩个参数(n->10w, ...
- 洛谷—— P2002 消息扩散
P2002 消息扩散 题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市 ...
- POJ 1780 【手工递归】【欧拉回路】
题意: 1.提供密码的位数. 2.密码的输入可以一直保持,取后n位作为密码.如果密码正确则开锁. 3.设计一种方法使得在输入最少的情况下破译.(即保证每个密码只输入一次) 4.输出输入的数字的序列. ...
- Spring实战Day1
为什么要学习使用Spring ------为了全方面简化Java开发 如何简化开发呢? 1.基于POJO[简单老式Java对象(Plain Old Java object)]的轻量级和最小侵入性编程, ...
- MySQL 资源大全
干货!MySQL 资源大全 提交 我的留言 加载中 已留言 shlomi-noach 发起维护的 MySQL 资源列表,内容覆盖:分析工具.备份.性能测试.配置.部署.GUI 等. 伯乐在线已在 Gi ...
- 【计算机视觉】SIFT中LoG和DoG比較
在实际计算时,三种方法计算的金字塔组数noctaves,尺度空间坐标σ,以及每组金字塔内的层数S是一样的.同一时候,如果图像为640*480的标准图像. 金字塔层数: 当中o_min = 0,对于分辨 ...
- 深入浅出AOP(一)
动态代理实现AOP: AOP事实上非常早之前依照做出来了一些东西,之所以不敢说做出来了.是由于它是什么?怎么实现?做出来的东西是不是?先前一直查资料.查到的资料跟着做.到后来发现,AOP越来越大,而非 ...
- Mongodb for PHP教程之数据操作
Mongodb的常用操作 参看手册,php官方的http://us2.php.net/manual/en/mongo.manual.php 也可以参看mongodb官方的教程 数据库连接 ⑴默认格式 ...