oc知识点 内存高级

一属性的内存管理

1属性的语义特征

①assign 基本数据类型(char,short,int,float,double)

<1>最开始使用的set get方法的实现

@property (nonatomic, assign) NSIntger age;
set
     - (void)setName:(NSIntger)age {
       _age = age;
}
get
     - (NSIntger)age {
         return _age;
}

<2>修改后的代码

set
- (void)setName:(NSIntger)age {
   _age = age;
}
get
- (void)setName:(NSIntger)age {
    [_age release];
    _age = [age retion];

 

②retain 对象类型

@property (nonatomic, retain) NSString *name;
set
     - (void)setName:(NSString *)name {
         if (_name != name) {
             [_name release];
             _name = [name retain];
         }
}
get
     - (NSString *)name {
         return [[_name retain] autorelease];
}

 

③copy 对象类型,且遵循了<NSCopying>协议的

@property (nonatomic, copy) NSString *name; 
set
    - (void)setName:(NSString *)name {
        if (_name != name) {
            [_name release];
            _name = [name copy];
        }
}
get
    - (NSString *)name {
        return [[_name retain] autorelease];
}

如果要对一个对象进⾏行copy操作,那该对象所属的类必 须遵守<NSCopying>协议

二dealloc释放那个实例变量

1dealloc是NSObject的一个实力方法,用于回收alloc开辟的内存空间

2这个方法在对象引用计数为0时,由系统自动调用

3通常我们在dealloc中释放类的实例变量

修改前
(void)dealloc { [super dealloc]; }
修改后
- (void)dealloc { [_name release]; [super dealloc

注意  永远不要手动调用dealloc

     在dealloc方法的最后一行必须要写【super dealloc】,让系统真正去销毁对象

三便利构造器的内存管理

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

现在考虑p该如何释放?

+ (id)personWithName:(NSString *)name {
Person *p = [[Person alloc] initWithName:name]; r[epturn [p autorelease];
} [p }

四集合的内存管理

1常见集合 NSArray NSDictionary ,NSSet

2集合会自主管理集合内部的元素

  集合内存的管理方式:

   ①加入集合的元素会被retain

   ②移除集合的元素会被release

  ③集合被释放时会堆积和中所有元素release;

五KVC

1 kvc ;key Value Coding 键值编码 ,是一种间接访问器方法

2KVC 中常见的方法:

- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValuesForKeysWithDictionary:(NSDictionary
*)keyedValues

虽然提供了这些方法但是对于想获取信息的时候也可以直接使用get方法

注意:当使用KVC时,如果key值和属性名不一样时就会放生程序运行崩溃

//如果是用kvc赋值,一定要重写这个方法,这个方法可以什么都不写,作用防止找不到key而崩溃

-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
    //NSLog(@"++=%@:%@",key,value);
}

或者

- (id)valueForUndefinedKey:(NSString *)key {
}

六ARC

1ARC 自动引用计数,由开发者开辟内存空间,但事实不需要释放内存空间,由系统自动释放空间

2ARC本质还是基于MRC的,只不过是系统自动添加了释放内存的方法

3ARC 是编译器特性,而不是运行时特性,更不是垃圾回收器

 

ARC的注意事项

1当工程开启ARC后由于编译器会自动帮你释放内存,所以和内存有关的操作retain release autorelease 都不能写

2当重写dealloc方法时 也不能写【super dealloc】,否则会报错

 

语意特性

① assign 基本数据类型

② strong 对象类型,相当于MRC中的retain

③ copy 对象类型 ,且遵守了<NSCopying>协议

④ weak 对象类型 ,但是内部不会对对象做retain的操作

 

ARC 与MRC的混编

如果需要对特定⽂文件开启或关闭ARC,可以在⼯工程选项中选择

Targets -> Compile Phases -> Compile Sources,在⾥里⾯面找到对应⽂文 件,添加flag:

打开ARC:-fobjc-arc 关闭ARC:-fno-objc-arc

 

posted @ 2016-03-01 20:13  光着小脚丫  阅读(136)  评论(0编辑  收藏  举报