黑马程序员-[OC]学习之旅-(构造与内存管理)

构造方法:

用来初始化对象实例变量值的方法,是对象方法,-开头

重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值

  构造方法的调用:

Person *p = [Person new] ;

new方法的内部分别调用两个方法完成了3件事

1、使用alloc方法类分配存储空间(返回分配的对象)

2、使用init方法来对对象进行初始化

3、返回对象的首地址

重写构造方法

  1. -(id)init{
  2. if(self = [super init]){
  3. //为子类增加属性进行初始化
  4. }
  5. }

[super init ]的作用:

面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化

  1. Gun
  2. @interface Gun :NSObject
  3. @property (nonatomic, assign) int bulletCount;//子弹数
  4. @end
  5. @implement Gun
  6. -(instancetype)initWith:(int)count{
  7. if(self = [super init])
  8. _bulletCount = count;
  9. return self;
  10. }

  11. Soilder  类
  12. @inteface Solider:NSObject
  13. @property (nonatomic, strong) Gun *gun;//枪
  14. @property (nonatomic, copy)NSString *name;
  15. @end
  16. @implement Soilder
  17. -(instancetype)initWithName:(NSString *)name{
  18. if(self = [super init]){
  19. _gun = [Gun new];
  20. _gun.bulletCount = 100;
  21. _name = name;
  22. }
  23. return self;
  24. }

自定义构造方法的实用注意:

自己做自己的事情

父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性


内存管理: 

为什么内存管理?

移动设备的内存有限,每个APP所占的内存有限,当app所占的内存较多时,系统就会发出内存警告,个app可用的内存被限制。

管理范围:

任何继承NSObject对象,对其他的基本数据类型无效。

本质原因:对象和其他数据类型在系统中的存储的空间不一样,其他局部变量主要存放在栈中,而对象存储在堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在内存中,造成内存泄露。


内存管理原理:

对象的所有权及引用计数

对象所有权概念:

任何对象都可能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在

对引用计数器的操作:

给对象发送消息,进行相应的计数器的操作;

retain消息:使计数器+1.该方法返回对象本身

release消息:是计数器-1(并不代表释放对象)

retainCount消息:获得对象当前的引用计数器值

对象的销毁:当一个对象销毁时,系统会向对象发送一条dealloc消息,相当于对象的临终遗言

注意:一般我们需要重写dealloc方法。
在dealloc方法内部,要调用[super dealloc];

管理分类:

ARC 自动管理( 自动引用计数)

MRC 手动管理

garbaeg collection(垃圾回收)ios不支持

手动管理时一定要重写dealloc方法

1[super dealloc] 先释放子类占用的空间在释放父类占用的空间

2 对self 作用有的其他对象做一次release操作

-(void)dealloc{

[_car release];

[super dealloc];

}

注意:不要直接通过对象调用dealloc方法

管理原则:

1、只要还有人使用对象,这个对象就不会被回收

2、谁创建的。谁release

3、谁retain 谁release

管理对象:野指针:已经被回收内存空间

僵尸对象:所占内存已经被回收的对象

 单个对象的内存管理问题:

对象的内存泄露:

1、retain和release个数不匹配导致内存泄露

2、对象使用过程中被赋值nil,导致内存泄露

3、函数或者方法中不当的使用了retain或者release造成的问题

多个对象内存管理:

1)注意野指针的访问:一个对象在没有销毁之前,可以任意多次的调用自己的方法,如果因为里面可能调用了已经销毁的对象了,但是此时会报错(一定要开启僵尸对象检测模式)。
2)一定要注意, 当一个对象作为另一个对象的实例变量的时候,注意变量一定要销毁,销毁的方法有,在set方法中,如果调用的还是同一个方法,则加上一个[P retain]否则,如果不是同一个方法,则要先加上一个dealloc 然后再[P retain];
3) 如果在一个类中,有其他的对象(关联关系),则在写set方法书写的时候,要先release 旧值,然后retain新值。

set方法中内存管理

1、基本数据类型:直接赋值

2、OC对象类型先release旧值,

  1. -(void)setStudent:(Student *)student{
  2. //先判断是不是新传入的对象那个
  3. if(_student != student){
  4. //对旧值对象release
  5. [_student release];
  6. //对新对象retain
  7. _student = [student ratain]
  8. }
  9. }

@property参数

set和get方法的名称

@property (nonatomic, assign, setter = setVip,getter = isVip ) BOOL vip;

[super init ]的作用:

面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值