oc的MRC和ARC的区别

#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    //字面量

    NSString *str = @"doc";

    

    //对象方法


    NSString *str2 = [[NSString alloc] initWithUTF8String:"abc"];

    

    //类方法

    NSString *str3 = [NSString stringWithFormat:@"jack"];


    //区别:通过字面的方式创建出来的对象保存在常量区,通过对象方式和类方法创建出来的对象保存在堆中


    

    //

    //1 内存有系统管理 局部变量保存在栈中,当变量离开了其所在的代码块就会被回收

    

     //堆内存

    //需要程序员自己管理 oc中的对象对象保存在堆中

//    内存管理不当会造成的两个问题

//    1 内存泄漏 不再需要的对象没有释放,导致内存泄漏,内存泄漏会导致应用闪退

//    2 野指针 正在使用的对象被释放了,导致野指针,访问野指针导致程序奔溃

    

    //MRC 手动内存管理

//    1) 引用计数

//      1 每一个对象都有一个引用计数器

//      2 当对象出生的时候引用计数器为1

//      3 当调用对象的retain方法时候计数器+1

//      4 当给对象发送一条release消息的时候,计数器-1

//      5 当一个对象的引用计数为0的时候,这个对象立即被回收

//    (2) 内存管理原则

//         1 谁给一个对象发送 alloc copyratain消息,就必须在适当时候给这个对象发送相应的releaseautorelease消息

//         2 当你需要一个对象的时候就给这个对象的引用器+当你不需要这个对象了,就将该对象引用计数器-1

//    (3) 多个对象内存管理

//        1) setter方法

//            1 当设置新对象的时候需要对新对象做一次retain操作

//            2  当原来的对象不需要了,需要对原来的对象做一次release操作

//            3 如果是同一个对象 12的操作不需要

//           2)

//             1当一个对象即将被销毁的时候会调用这个方法

//             2 在对象消失时,会释放其成员所占用的内存

//             3 在释放内存之前首先要调用[super dealloc]

//           3) 循环引用

//               1  什么是循环引用 (当两个或多个对象引用构成一个封闭的环就是循环引用)

//               2   导致环中的对象都释放不了

    //           3 有一端必须是assign

//          (4) @property的使用

//                1) 内存管理

//                    1 基本数据类型使用assign

//                    2 普通对象一般使用retain

//                    3 NSString block对象使用copy

//                 2)权限控制 readonly 只读仅生成getter方法 readwrite 可读可写生成gettersetter方法

//                 3)线程安全 atomic 线程安全 会给setter方法加锁,访问速度比较慢

//                    nonatomic 非线程安全,不会给setter方法加锁,访问速度比较快

//                  4)方法名称定制 setter 定制setter方法名称

//                           getter定制getter方法名称

//           5)自动释放池 作用 延迟对象的释放 原理 自动释放池栈

//                 使用 当你抵用调用autorealse的时候该对象放到最近的自动释放池中

//                 当执行到自动释放池后面的大括号的时候,自动释放池会出栈,此时该栈中所有的对象做一次release操作

//                 你调用几次autorealse,当自动释放池被销毁的时候会调用几次relase,优点 你不必时刻关注对象的时候,让对象内存管理变的简单 缺点 对象不能及时得到释放,如果对象占用内存很大,它会导致你程序闪退

//   应用场景 当一个对象很小,使用次数很少的时候,可以使用自动释放 快捷构造方法 ,其他需要修奥延迟对象生命周期的地方

    

//    arc 自动引用计数

    

//       1) 什么是自动引用计数 它是编译器特性,不是运行时特性 。编译器会在适当的时候插入内存管理的代码

//       2) 强指针 默认所有的指针都是强指针 ,只要有强指针指向这个对象,这个对象就不会被销毁 ,只要 没有强指针指向这个对象,这个对象立即被销毁 关键字 strong

//    3 弱指针 弱指针不影响对象的销毁 关键字_weak

//    4) 循环引用 当多个对象间的引用形成一个环的时候就是循环引用 环中所有的对象都是方法释放不了 当出现循环引用的时候一端必须是weak

//     5@property 内存管理 assign 都不参与参与内存管理,用于基本数据类型

//          strong 强引用 用于普通对象 copy复制 用于字符串和block

//           weak 弱引用 防止循环引用

//     6  自动释放池 通过类方法创建出来的对象都在离它最近的方法池中

//    当自动释放池销毁的时候才会自动释放池中的对象

}


- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


你可能感兴趣的:(iOS)