#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 copy,ratain消息,就必须在适当时候给这个对象发送相应的release或autorelease消息
// 2 当你需要一个对象的时候就给这个对象的引用器+1 当你不需要这个对象了,就将该对象引用计数器-1
// (3) 多个对象内存管理
// 1) setter方法
// 1 当设置新对象的时候需要对新对象做一次retain操作
// 2 当原来的对象不需要了,需要对原来的对象做一次release操作
// 3 如果是同一个对象 1和2的操作不需要
// 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 可读可写生成getter和setter方法
// 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.
}