黑马程序员——OC的内存管理
来源:互联网 发布:python agent开发 编辑:程序博客网 时间:2024/06/09 16:34
——- android培训、java培训、期待与您交流! ———-
1.内存的创建和释放
让我们以Object-c世界中最最简单的申请内存方式展开,谈谈关于一个对象的生命周期。首先创建一个对象:
id testObject = [[ClassName alloc] init];//“ClassName”是任何你想写的类名,比如NSString NSArray等一切随意
注: alloc 是object-c 中常用来申请内存块的方式
此时,对于对象“testObject”来说,他的引用计数就是1了,原因就是他调用了alloc
来创建了一块只属于他的内存,这样对象的引用计数就得+1. 另外,Object-c中的另两个关键字retain
和copy
也会将对象的引用计数+1.根据Object-c的内存管理机制,我们在使用完“testObject”后,需要释放它。
[testObject release];
release后的对象,虽然已经释放,但是他的指针地址仍然存在,只是指向了一块已经释放且无用的内存,所以我们建议release后直接赋个nil来置空。
一般,如果我们能知道需要实现功能所涉及的“className”的具体类名,就不建议使用init方法去初始化,比如以下代码:
NSString *strTest=[[NSString alloc] initWithString:@"test"]; (推荐)NSString *strTest=[[NSString alloc] init]; (不推荐)
2.类方法和实例方法
简单来说,实例方法就是得有了具体实例(对象)后才能使用的方法,一般以减号形式作为方法的前缀来声明,比如API定义
-(id)initWithString:(NSString *)aString;
相比而言,类方法则无需具体对象,只需要类的名称即可调用,一般以加号形式作为方法的前缀来声明,比如API定义:
+(id)stringWithString:(NSString *)aString;
大可以将类方法理解为静态方法,类方法在对象还没创建出来之前已经有了。
3.属性关键字
@property (nonatomic, assign) int B;@property (nonatomic, retain) id classObj;
可以看到关键之@property后的括号出现了四个特征性关键字:nonatomic
, assign
, retain
, settet
, 这些关键字直接告诉编译器后面的变量用何种方式来存取。
assign
赋值方式 不复制不保留,直接赋值 YES
基本数据类型和本类不直接拥有的对象
retain
赋值方式 将新值保留一份赋覆盖原值 |NO |大部分对象可使用|
copy
赋值方式 将新值复制一份赋覆盖原值 NO 字符串选择性使用
readwrite
读写权限 生成getter和setter两个方法 YES 变量可读取可修改
readonly
读写权限 只生成getter方法 NO 变量只读不可修改
atomic 原子性 原子操作 YES 可以保留在多线程环境下,能安全的存取值
nonatomic
原子性 非原子操作 NO 不生成多线程同步内容
getter
存取方法 自定义取方法 NO
setter
存取方法 自定义赋值方法 NO
注:
- 关于
nonatomic
,如果我们能确定不需要多线程访问时,强烈推荐使用这个关键字,因为atomic
对于性能的损失相对较大 - 如果是类的delegate,推荐使用
assign
关键字,原因是避免了retain
的死循环造成的对象无法真正的释放
3.ARC新增关键字
ARC新增两个武功高强的左右护法:strong
和 weak
strong
的含义和retain
相同,weak
和assign
相同,修饰完的属性变量用法也是完全没有改变,不过strong
和weak
只能修饰对象。
苹果官方对于ARC机制中对象的内存引用规则:
任何对象,如果仍有持有者,就不会销毁
任何对象,已经没有任何持有者,即自动销毁
持有者就是只想对象的指针,如果是strong修饰的,即是对象的持有者,如果是weak属性的,则不是持有者
4.ARC机制的使用规则
对于ARC机制的使用,苹果发布了几条重要的规则需要开发者遵守。单单看那些生搬硬套的东西难免生涩,根据开发经验将规则总结如下:
不能调用
dealloc
,不能重写和调用retain
,release
,retainCount
和autorelease
,同理,@selector(retina)
,@selector(release)
这些曲线救国的方法也不能调用。dealloc
虽然能够重写,但是不能调用[super dealloc]
之类的方法,CoreFoundation框架由于非从属cocoa框架,所以CFRetain
和CFRelease
仍然正常使用。不能使用NSAllocateObjec或NSDeallocateObject函数来创建对象
不能在C语言的结构体中使用对象指针,同时建议用object-c的类来管理数据而不是结构体
不得使用NSAutoreleasePool对象。ARC中,全部使用
@autorelease
关键字代替,且比NSAutoreleasePool更高效不得使用内存Zone,那些牵涉NSZone的方法都不得使用。
不得对一个属性变量的取值方法命名以new开头
outlet
均用weak
关键字修饰,除非他是xib中最顶部的界面元素,则需要strong
。Core Foundation不适合ARC,该创建的仍创建,该释放的仍释放。
- 黑马程序员——OC---内存管理
- 黑马程序员——OC内存管理
- 黑马程序员——OC内存管理
- 黑马程序员——【OC】内存管理
- 黑马程序员——OC内存管理
- 黑马程序员——OC内存管理
- 黑马程序员——OC内存管理
- 黑马程序员——OC内存管理
- 黑马程序员——[OC]内存管理
- 黑马程序员 — OC(内存管理)
- 黑马程序员—OC内存管理
- 黑马程序员———OC的内存管理
- 黑马程序员——oc的内存管理
- 黑马程序员——OC的内存管理
- 黑马程序员-OC的内存管理笔记
- 黑马程序员——OC——内存管理
- 黑马程序员——OC——ARC内存管理
- 黑马程序员——OC——ARC内存管理
- redis集群实战
- Xcode出现警告:Terminating app due to uncaught exception 'NSUnknownKeyException'的解决方法
- 升级Xcode7.1 网络问题
- linux互斥锁操作
- wincmd.ini for windows
- 黑马程序员——OC的内存管理
- 让所有浏览器支持HTML5 video视频标签
- 解决PLSQL提示 is not a valid date and time
- c语言操作运算符的优先级,*p++,++*p,++*p++的结果
- IOS-UIScrollView的小用法
- OpenCV is not a panacea
- C++ typedef用法小结
- Leetcode136: Word Search
- java的static块执行时机