构造方法:
用来初始化对象实例变量值的方法,是对象方法,-开头
重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值
构造方法的调用:
Person *p = [Person new] ;
new方法的内部分别调用两个方法完成了3件事
1、使用alloc方法类分配存储空间(返回分配的对象)
2、使用init方法来对对象进行初始化
3、返回对象的首地址
重写构造方法
- -(id)init{
- if(self = [super init]){
- //为子类增加属性进行初始化
- }
- }
[super init ]的作用:
面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化
- Gun 类
- @interface Gun :NSObject
- @property (nonatomic, assign) int bulletCount;//子弹数
- @end
- @implement Gun
- -(instancetype)initWith:(int)count{
- if(self = [super init])
- _bulletCount = count;
- return self;
- }
- Soilder 类
- @inteface Solider:NSObject
- @property (nonatomic, strong) Gun *gun;//枪
- @property (nonatomic, copy)NSString *name;
- @end
- @implement Soilder
- -(instancetype)initWithName:(NSString *)name{
- if(self = [super init]){
- _gun = [Gun new];
- _gun.bulletCount = 100;
- _name = name;
- }
- return self;
- }
自定义构造方法的实用注意:
自己做自己的事情
父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性
内存管理:
为什么内存管理?
移动设备的内存有限,每个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旧值,
- -(void)setStudent:(Student *)student{
- //先判断是不是新传入的对象那个
- if(_student != student){
- //对旧值对象release
- [_student release];
- //对新对象retain
- _student = [student ratain]
- }
- }
@property参数
set和get方法的名称
@property (nonatomic, assign, setter = setVip,getter = isVip ) BOOL vip;
[super init ]的作用:
面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化