object-c 内存管理机制的学习

1.内存的创建和释放

   让我们以Object-c世界中最最简单的申请内存方式展开,谈谈关于一个对象的生命周期。首先创建一个对象:

//“ClassName”是任何你想写的类名,比如NSString  NSArray等一切随意
id testObject = [[ClassName alloc] init];
注: 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机制中对象的内存引用规则:

    (1)任何对象,如果仍有持有者,就不会销毁

    (2)任何对象,已经没有任何持有者,即自动销毁

  持有者就是只想对象的指针,如果是strong修饰的,即是对象的持有者,如果是weak属性的,则不是持有者

4.ARC机制的使用规则

   对于ARC机制的使用,苹果发布了几条重要的规则需要开发者遵守。单单看那些生搬硬套的东西难免生涩,根据开发经验将规则总结如下:

   (1)不能调用dealloc,不能重写和调用retain,release,retainCount 和autorelease,同理,@selector(retina),@selector(release)这些曲线救国的方法也不能调用。dealloc虽然能够重写,但是不能调用[super dealloc]之类的方法,CoreFoundation框架由于非从属cocoa框架,所以CFRetain和CFRelease仍然正常使用。

   (2)不能使用NSAllocateObjec或NSDeallocateObject函数来创建对象

   (3)不能在C语言的结构体中使用对象指针,同时建议用object-c的类来管理数据而不是结构体

   (4)不得使用NSAutoreleasePool对象。ARC中,全部使用@autorelease关键字代替,且比NSAutoreleasePool更高效

   (5)不得使用内存Zone,那些牵涉NSZone的方法都不得使用。

   (6)不得对一个属性变量的取值方法命名以new开头

   (7)outlet均用weak关键字修饰,除非他是xib中最顶部的界面元素,则需要strong。

   (8)Core Foundation不适合ARC,该创建的仍创建,该释放的仍释放。

转载于:https://www.cnblogs.com/haibosoft/p/3656290.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值