OC中的属性、方法及内存管理
普通方法:关注(代表)对象可以”干什么”,过程中需要实例变量。-(void)show;输出 … 访问属性
属性:属性专门处理实例变量。(程序执行过程当中)
初始化方法:一创建对象(第一时间),给实例变量赋值。
工厂方法:只一个方法,帮我们解决创建对象问题、初始化对象的问题。工厂方法创建对象最简单。(对象达到一定量级)
补:在类方法中,可以调用类中创建的实例的实例方法或实例变量。
算法、设计模式:
是人们总结的一种规律,一种思想。
1.单例模式
是一种特殊的工厂方法。
“单例”:只有一个唯一的。
单例模式的好处,节约资源、提高效率、统一管理。
2.内存管理
iOS开发中,对堆内存的创建、销毁(释放),就叫做内存管理。
内存管理有两种方式:
MRC:手动内存管理。
ARC:自动内存管理。
引用计数器:用来记录对象被引用的次数,每个对象天生就有一个引用计数器。
Reference Counting
引用的次数:一个对象被几个引用使用。
TRStudent *stu = [[TRStudent alloc]init];
TRStudent *stu2 = stu;
在xcode5以后,都是强制使用ARC内存管理的。
需要手动改成MRC内存管理:
项目->BuildSetting->All->ARC->OC language->OC ARC=NO;
强制操作系统立刻回收内存:
edit scheme->Diag…->Enable Zombie Objects
内存管理的机制:
每个对象都有自己的引用计数器。 在MRC内存管理模式下,引用计数器计算机是无法自动操作的。
向对象发送[对象 retainCount];该对象引用计数器的值
当向对象发送alloc、copy、new消息的时候,该对象的引用计数器会自动设置为1.
当不再使用对象的时候的时候,会发送release消息,通知引用计数器”减”1。
当一个对象的引用计数器的值为0时,”系统”会”自动”销毁该对象,并回收该内存空间。
当对象销毁的时候,会”自动”发送dealloc消息。
内存管理使用不当: 通过引用使用一个以经不存在的对象(堆空间),会出现异常、crash(Exception)。
解决:1.野指针问题,使用空指针来解决野指针问题。
对象不在使用的时候,忘记发送release消息,内存溢出(内存浪费)(内存泄露)。
2.多个引用使用同一个对象,需要retain操作。
解决:1.谁创建的内存(谁加1),谁就有责任减1。
2.声明式属性解决加1操作,但减1操作依然需要手动处理。
new相当于
[TRStudent new] 相当于 [[TRStudent alloc]init]
.m文件中的dealloc方法
-(void)dealloc{
NSLog(…);
[super dealloc];
}
3.声明式属性
a.默认情况下 声明式属性 并没有解决内存问题
b.如果需要解决内存问题 需要加上(retain)
@property(retain) TRBook* book;
c.声明式属性解决的只有setter/getter问题 加1操作
d.dealloc中减1操作 依然需要我们自己做。
如果一个对象中的属性是对象类型,声明式属性记得加retain关键字修饰
当一个对象销毁的时候,应该将其拥有的属性对象,全部release
e.@property(参数类型1,参数类型2)
参数类型1:
retain:修饰属性是对象类型
assign:修饰基本数据类型,默认是assign类型
copy:修饰一些特殊的对象类型,NSString
readonly:只有getter方法,没有setter方法。
readwrite:有setter方法,也有getter方法。
getter=method:可以修改getter方法的方法名。
setter=method:可以修饰setter方法的方法名。
参数类型2:(多线程)
atomic 原子性操作 解决线程安全问题 消耗资源 默认值
nonatomic 非原子性操作 存在线程安全问题 节省资源
4.自动释放池
a.自动释放池可以帮我们解决自动释放(release)对象的操作。 b.工厂方法存在内存释放的问题、getter内存释放的问题、创建多个对象的时候,容易忘记释放对象。
c.语法规则 :
@autoreleasepool{
}
d.默认情况下,自动释放池不会管理对象,需要手动将对象放到自动释放池中,由自动释放池管理对象。
e.向对象发送autorelease消息,就可以将对象放到自动释放池中管理。
f.自动释放池的开始、结束
autorealespool{开始
。。。
}结束
当自动释放池结束的时候,会向池中的对象发送release消息
OC中的属性、方法及内存管理的更多相关文章
- 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理
1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...
- OC中@property属性关键字的使用(assign/weak/strong/copy)
OC中@property属性关键字的使用(assign/weak/strong/copy) 一.assign 用于 ‘基本数据类型’.‘枚举’.‘结构体’ 等非OC对象类型 eg:int.bool等 ...
- set方法的内存管理细节
一.多个对象之间的内存管理 1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作) 2.你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次releas ...
- js中__proto__, property, prototype, 对象自身属性方法和原型中的属性方法的区别
__proto__: 这个属性是实例对象的属性,每个实例对象都有一个__proto__属性,这个属性指向实例化该实例的构造函数的原型对象(prototype). proterty:这个方法是对象的属性 ...
- Swift中的可选链与内存管理(干货系列)
干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...
- OC 知识:彻底理解 iOS 内存管理(MRC、ARC)
1. 什么是内存管理 程序在运行的过程中通常通过以下行为,来增加程序的的内存占用 创建一个OC对象 定义一个变量 调用一个函数或者方法 而一个移动设备的内存是有限的,每个软件所能占用的内存也是有限的 ...
- 内存管理2-set方法的内存管理
1.对象之间的内存管理: 每个学生都有一本书 book类 @price 学生类 @age @book -------------------- #import "book.h" ...
- 高端内存映射之vmalloc分配内存中不连续的页--Linux内存管理(十九)
1 内存中不连续的页的分配 根据上文的讲述, 我们知道物理上连续的映射对内核是最好的, 但并不总能成功地使用. 在分配一大块内存时, 可能竭尽全力也无法找到连续的内存块. 在用户空间中这不是问题,因为 ...
- Java中的垃圾回收机制&内存管理&内存泄漏
1. Java在创建对象时,会自动分配内存,并当该对象引用不存在的时候,释放这块内存. 为什么呢? 因为Java中使用被称为垃圾收集器的技术来监视Java程序的运行,当对象不再使用时,就自动释放对象所 ...
随机推荐
- HDU2050离散数学折线分割平面
折线分割平面 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- CodeForces - 404B(模拟题)
Marathon Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Sta ...
- QQ图片名字
ﻩ并亲了你一下ﻩ大兔子҉҉大兔子҉҉҉҉҉҉҉҉
- ubuntu下常用服务器的构建
1 ftp 1.1 ftp服务器 1.安装vsftpd服务器 sudo apt-get install vsftpd 2.配置vsftpd.conf文件 sudo vi /etc/vsftpd.con ...
- linux 小喇叭 没了
Waiting for sound system to respond 方法: # pulseaudio --start -D W: main.c: This program is not inten ...
- poj 3281 最大流+建图
很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很 ...
- FileUpload之FileItem
转自:http://asialee.iteye.com/blog/706079 FileItem类主要是封装了一个File Item或者是FormItem,它的主要的方法如下,需要说明的是对于Form ...
- 【Grunt】关于Grunt可视化的尝试
使用Grunt遇到的问题? 必须要安装NodeJS 必须安装grunt-cli 需要编写复杂的Gruntfile.js规则 每个项目中必须存在nodejs的grunt模块 不方便管理每一个包含grun ...
- HDU 4513 吉哥系列故事——完美队形II manacher
吉哥系列故事——完美队形II Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希 ...
- SQL 计算列
SQL计算列,可以解决一般标量计算(数学计算,如ColumnA*ColumnB)的问题,而子查询计算(如select sum(salary) from tableOther where id=’ABC ...