1、属性的内存管理

 1> 属性的语义特性

 2> assign下的属性内部实现

 @property (nonatomic, assign) NSString *name;
@synthesize name = _name;
// setter
- (void)setName:(NSString *)name {
_name = name;
}
// getter
- (NSString *)name {
return _name;
}

 3> retain的内部实现

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

 4> copy的内部实现

 - (void) setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name copy];
}
}
- (NSString *)name {
return [[_name copy] autorelease];
}

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

2、dealloc释放实例变量

 1> 概述

  dealloc是NSObject的一个实例方法,用于回收alloc开辟的内存空间。这个方法在对象引用计数为0时,由系统自动调用。

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

 2> 内部实现

 - (void)dealloc {
[_name release]; // 解决setter方法中存在的内存泄露
_name = nil;
[super dealloc];
}

 3> 注意事项

  永远不要手动调 dealloc。

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

3、便利构造器的内存管理

 1> 自定义初始化方法

 - (instancetype)initWithName:(NSString *)name {
self = [super init];
if (self) {
self.name = name; // 必须为self.,不然会出现Crash
}
return self;
}

 2> 便利构造器的内部实现

 + (instancetype)personWithName:(NSString *)name {

     Person *person = [[Person alloc] initWithName:name];
return [person autorelease]; }

4、集合的内存管理

5、KVC

 1> 概述

  KVC:Key Value Coding,键值编码,是一种间接访问实例变量的方法。

  KVC 提供了一个使用字符串(Key)而不是访问器方法,去访问一个对象实例变量的机制。

 2> KVC中常用的方法

          - (id)valueForKey:(NSString *)key; // 通过key值取值
- (void)setValue:(id)value forKey:(NSString *)key; // 赋值操作
- (id)valueForKeyPath:(NSString *)keyPath; // 通过路径访问变量
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath; // 通过路径进行赋值操作
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues; // 同时给多个属性赋值

 3> 通过KVC键值编码访问属性

  ① key值查找

      [stu setValue:@"xiaoqiang" forKey:@"name"];
[stu setValue:@"boy" forKey:@"gender"];
[stu setValue:@ forKey:@"age"]; NSLog(@"name = %@, gender = %@, age = %@", [stu valueForKey:@"name"], [stu valueForKey:@"gender"], [stu valueForKey:@"age"]);

  ② 路径查找

         Teacher *tea = [[Teacher alloc] init];

         stu.teacher = tea;

         [stu setValue:@"fangfang" forKeyPath:@"teacher.name"];

         NSLog(@"teacherName = %@", [stu valueForKeyPath:@"teacher.name"]);

  ③ 同时给多个属性赋值

      NSDictionary *dict = @{
@"name" : @"fangfang",
@"gender" : @"girl",
@"age" : @,
@"hobby" : @"fangfang"
};
Student *stu2 = [[Student alloc] init];
[stu2 setValuesForKeysWithDictionary:dict]; NSLog(@"name = %@, gender = %@, age = %ld", stu2.name, stu2.gender, stu2.age);

 4> KVC抛出异常的方法

  ① 使用KVC设置值对象时

   如果当前类没有找到对象的Key值,系统会自动调用 setValue: forUndefinedKey: 方法

    该方法的默认实现是抛出一个异常,如果不想抛出异常,就重写这个方法

 // 重写
// 使用KVC设置值对象
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
NSLog(@"不存在Key:%@", key);
}

  ② 使用KVC取值的时候

     如果当前类没有找到对应的Key值,系统会自动调用 valueForUndefinedKey: 方法

     该方法的默认实现是抛出一个异常,如果不想抛出异常,就重写这个方法

 // 重写
// 使用KVC取值的时候
- (id)valueForUndefinedKey:(NSString *)key { return nil;
}

 5> KVC的实现机制

   KVC按顺序使用如下技术:

  •  检查是否存在getter方法-<key>或者setter方法-set<key>:的方法;
  • 如果没有上述方法,则检查是否存在名字为-_<key>、<key>的实例变量;
  • 如果仍未找到,则调用 valueForUndefinedKey: 和 setValue: forUndefinedKey: 方法。这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。

6、ARC

 1> 概述

  ARC:Automatic Reference Counting,自动引用计数,由开发人员开辟内存空间,但是不需要释放该内存空间,由系统自动释放该空间。
  ARC本质上还是基于MRC的,只不过是系统自动添加了释放内存的方法。
      ARC是编译器特性,而不是运行时特性,更不是垃圾回收器(GC)。
      从Xcode5.0后,创建的工程默认是开启ARC的。

 2> ARC的注意事项

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

  当重写dealloc方法时, 也不能写[super dealloc],否则会报错。

 3> ARC的属性语义

 4> ARC 与 MRC 的混编

  如果需要对特定文件开启或关闭ARC,可以在工程选项中选择Targets -> Compile Phases -> Compile Source ,在里面找到对应文件,添加flag:
      打开ARC:-fobjc-arc
      关闭ARC:-fno-objc-arc

【原】iOS学习18之OC内存管理高级的更多相关文章

  1. iOS学习17之OC内存管理

    1.内存管理的方式 1> iOS应用程序出现Crash(闪退),90%的原因是因为内存问题. 2> 内存问题 野指针异常:访问没有所有权的内存,如果想要安全的访问,必须确保空间还在 内存泄 ...

  2. iOS学习之Object-C语言内存管理高级

    一.属性的内存管理

  3. iOS学习笔记之ARC内存管理

    iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...

  4. iOS学习之Object-C语言内存管理

    一.内存管理的方式      1.iOS应用程序出现Crash(闪退),90%的原因是因为内存问题.      2.内存问题:      1)野指针异常:访问没有所有权的内存,如果想要安全的访问,必须 ...

  5. iOS学习之C语言内存管理

         一.存储区划分      按照地址从高到低的顺序:栈区,堆区,静态区,常量区,代码区    1.栈区:局部变量的存储区域     局部变量基本都在函数.循环.分支中定义     栈区的内存空 ...

  6. iOS经典面试题总结--内存管理

    iOS经典面试题总结--内存管理 内存管理 1.什么是ARC? ARC是automatic reference counting自动引用计数,在程序编译时自动加入retain/release.在对象被 ...

  7. OC 内存管理机制总结

    OC 内存管理机制总结 一:OC内存管理机制目前分为两块,其一自动内存管理机制,其二手动内存管理机制: 1.首先我们从自动内存管理机制讲起: 1)什么是自动内存管理机制,自动内存管理机制就是程序中所创 ...

  8. OC内存管理-OC笔记

    内存管理细节:http://blog.sina.com.cn/s/blog_814ecfa90102vus2.html 学习目标 1.[理解]内存管理 2.[掌握]第一个MRC程序 3.[掌握]内存管 ...

  9. 菜鸟学习Cocos2d-x 3.x——内存管理

    菜鸟学习Cocos2d-x 3.x——内存管理 2014-12-10 分类:Cocos2d-x / 游戏开发 阅读(394) 评论(6)    亘古不变的东西 到现在,内存已经非常便宜,但是也不是可以 ...

随机推荐

  1. python基础——第三方模块

    python基础——第三方模块 在Python中,安装第三方模块,是通过包管理工具pip完成的.  如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了.  如果你正在使用Window ...

  2. 从键盘输入成绩,找出最高分,并输出学生成绩等级。成绩>=最高分-10,为A,成绩>=最高分-20,为B,成绩>=最高分-30,为C,其余等级为D

    import java.util.Scanner;public class TestStudent { public static void main(String[] args) { //从键盘获得 ...

  3. IDT5V49EE904资料学习

    一.特性: 1.4个内部PLL 2.内部非易失EEPROM. 3.最快400k的I2C串行接口. 4.输入时钟范围:1M—200M. 5.输出时钟范围:4.9k—200M 6.输入晶振参数带有在线可编 ...

  4. php 投票系统练习

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- AIDL

    服务端: 最终项目结构: 这个项目中,我们将用到自定义类CustomData作为服务端与客户端传递的数据. Step 1:创建CustomData类 package com.ldb.android.e ...

  6. EF – 8.多对多关联

    5.6.10 <多对多关联(上)> 时长:9分57秒 难度:难 5.6.11<多对多关联(下)> 时长:8分50秒 难度:难 如果单独地把多对多关联的CRUD拿出来讲,确实比较 ...

  7. Spring.Net的IOC入门

    1.构造器注入 namespace Spring.Net { class Program { //构造器注入 static void Main(string[] args) { IApplicatio ...

  8. HYSBZ 2440 完全平方数(莫比乌斯反演)

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2440 若i为质数,n为i*i的倍数,则称n为含平方因子数. 求1~n的无平方因子数. F(x) ...

  9. STL Map的使用

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力.下面就通过示例记录一下map的使用: 一.向map中 ...

  10. hdu 4033 2011成都赛区网络赛 余弦定理+二分 **

    二分边长,判断最后内角和是否为2pi,注意l与r的选取,保证能组成三角形 #include<cstdio> #include<iostream> #include<alg ...