5.ios-内存管理
知识点
1.内存管理作用
2.内存管理原理
3.黄金法则
4.setter/getter
5.属性
======================================
内存管理
1.回忆:c语言中通过那些函数实现的内存管理
c malloc free 空指针
if (xxx != null){free;}
1)堆空间释放有哪些麻烦的地方
2)如何防止多次释放
3)如何防止内存泄露
2.oc的内存管理方式(引用计数 reference counting)
1)手动管理(MRC)
2)垃圾自动回收(不适用于IOS,只能使用在10.5以后的mac系统)
3)ARC (Automatic Reference Counting,类似于C++中的智能指针)
3.http://developer.apple.com
The basic rule to apple is Everything the increases the reference counter
with alloc, [mutable]copy[WithZone:] or retain is in charge of the corresponding
[auto]release
1)如果对一个对象使用了alloc、[mutable]copy[WithZone:],retain 那么你必须使用相应的release或者autorelease。
2)retain作用:保留对象,使对象计数器+1
alloc作用: 创建对象,并将该对象的计数器初始化为1
copy作用: 拷贝对象,并将新对象的计数器设置为1
3)release作用:将对象计数器-1
4.内存管理类定义
1)基本类型:所有的c类型
如:char, short, int, long, struct, union, enum
oc的内存管理对c语言基本类型无效
2)oc类型(非基本类型)
任何继承于NSObject类的对象都属于OC类型
NSString , NSInteger
在oc当中解决内存问题
引入了内存计数retainCount
每一个对象都有一个计数的属性retainCount
1.只要对象new,alloc,copy,mutablecopy,retain那么就会导致该对象的retainCount加1
2.调用对象的方法release,autorelease 都会使该对象的引用计数减1
3.当对象的引用计数为0时 系统会自动调用该对象的析构函数dealloc,而且这个方法不能手工调用
4.在oc中c语言的类型没有引入内存计数,不需要进行内存管理(char int float bool long...)
5.对空指针进行release是合法,不会crash
为了维持对象的引用计数平衡:谁导致retainCount 增加就应该谁负责retainCount减少
========================================
setter和getter函数
1.回忆:如果访问对象中的成员变量
2.setter和getter函数的作用
3.setter和getter如何命名
4.setter和getter中的内存管理
=======================================
点语法
1.回忆:对象中的成员变量是否可以像c中的结构体和c++中的类一样,通过点运算符访问内部的变量
2.点语法的作用
3.点语法和setter/getter函数的关系
============================== m =========
属性(property)和合成(synthesize)
1.思考:当一个类中的成员变量非常多的时候,setter和getter是否会显得非常臃肿
如何让代码变得更加的简洁
2.property用处
1)让编译器自动生产函数声明
3.property使用
1) @property (属性) 变量类型 变量名
2) property在属性名和成员名不同时如何展开
4.synthesize用处
1)让编译器自动实现setter和getter函数
======================================
property属性
1.原子操作
atomic/nonatomic
2.读写操作
readonly/readwrite
3.赋值操作
retain/assin/copy
4.arc操作
weak/strong
只要某个对象被任一strong指针指向,那么它将不会被销毁。
如果对象没有被任何strong指针指向,那么就将被销毁