OC第十天:内存管理⾼级

⼀、属性的内部实现原理
⼀、assign
setter⽅法
@property(nonatomic,assign)NSString *name;
- (void)setName:(NSString *)name
{ _name = name; }

getter⽅法
- (NSString *)name
{ return _name; }


⼆、retain
setter⽅法
@property(nonatomic,retain)NSString *name;
- (void)setName:(NSString *)name
{ if(_name != name)
{ [_name release];
_name = [name retain]; } }

getter⽅法
- (NSString *)name
{ return [[_name retain]autorelease]; }



三、copy
setter⽅法
@property(nonatomic,copy)NSString *name;
- (void)setName:(NSString *)name
{ if(_name != name)
{ [_name release];
_name = [name copy]; } }

getter⽅法
- (NSString *)name
{ return [[_name retain]autorelease]; }

// set get 方法都重写系统将不在生成_name 只重写一个系统会创建_name可以使用
      //[nil release];等于什么都没做
// 学了属性和内存后不写_name self.
        //这种赋值方式对于基本数据类型是安全的
        //对于对象类型赋值是不安全的 应该用set方法进行赋值保证内存安全

⼆、dealloc内释放实例变量
dealloc是NSObject的⼀个实例⽅法,与alloc对应,⽤于回收开辟的内 存空间
这个⽅法在对象引⽤计数为0时,由系统⾃动调⽤
通常我们在dealloc中释放类的实例变量
- (void)dealloc{
[_name release];//释放
setter⽅法泄露的实例变量
[super dealloc]; }

永远不要⼿动调⽤dealloc. 在dealloc⽅法的最后⼀⾏,必须要写[super dealloc];







三、便利构造器⽅法的实现原理

Person.m中
+ (id)personWithName:(NSString *)name
{ Person *p =[ [Person alloc] initWithName:name];
 return [p autorelease];
}







四、collection的内存管理
collection就是NSArray,NSDictionary,NSSet…等容器类
collection会⾃主管理⾃⼰内部的元素
加⼊collection中的对象会被retain
移除出collection的对象会被release
collection被释放会对内部所有对象release


五 多态
⾯向对象的三⼤特性之⼀。
不同类型对象在响应同⼀个⽅法时的不同实现。
⽗类指针可以指向⼦类对象。
多态的特点
⽗类指针可以指向不同的⼦类对象
允许在多个类中定义同⼀个消息接⼝。
可以屏蔽不同⼦类对象之间的差异,写出通⽤代码。
适应需求的不断变化
// 多态的真谛
        // 父类指针指向子类对象
总结
assign、retain、copy对应不同的setter实现。为实例变量赋值 时,尽量使⽤setter⽅法,再次赋值时,会把之前值release。
dealloc在对象引⽤计数为0时⾃动调⽤,不要显⽰调⽤。
dealloc 实现体内,先要释放实例变量,然后执⾏[super dealloc];
便利构造器的内存管理是借助autorelease实现的。
集合会管理⾃⼰的元素。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章