标签:不可用 count str 获得 16px run 自动 默认 reference
一、什么是内存管理
所以,我们需要对内存进行合理的分配内存、清除内存,回收那些不需要再使用的对象。从而保证程序的稳定性。
那么,那些对象才需要我们进行内存管理呢?
这是因为
堆
里边。堆
:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表栈
里面栈
:由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈(先进后出)int main(int argc, const char * argv[]{
@autoreleasepool {
int a = 10;//栈
//p在栈中
//Person对象在堆中
Person *p = [[Person alloc] init];
//a,p都会被回收,但Person对象remainCount = 1,不会被回收
}
return 0;
}
二、MRC手动管理内存(Manual Reference Counting)
工程文件->build Setting -> Objective-c automic reference counting -> NO
系统是根据对象的引用计数器来判断什么时候需要回收一个对象所占用的内存
注:不要主动去调用某个对象的dealloc方法,这个方法是系统自己主动调用
一旦对象被回收了, 它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)
- (void)dealloc {
[self.address release];//property属性
[super dealloc];
}
int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [[Person alloc] init]; // 执行完引用计数为1 [p release]; // 执行完引用计数为0,实例对象被释放 p = nil; // 此时,p变为了空指针 [p release]; // 再给空指针p发送消息就不会报错了 [p release]; } return 0; }
1??如果一个对象不能被立刻释放 但是有需要释放 那么可以使用autorelease来释放 ,延迟释放
2??当使用这个关键字修饰一个对象的时候,系统会将这个对象放到自动释放池里面,每隔一段时间去看自动释放池里面的对象的retainCount是否为0 ,如果为0那么系统会自动摧毁这个对象
3??如果程序退出 或者 自动释放池的作用域结束 ,系统也会将这个自动释放池里面的对象摧毁
4??autorelease的创建方法@autoreleasepool{
}
5??autorelease的使用方法
Person *p = [[Person new] autorelease];
注:并不是放到自动释放池代码中,都会自动加入到自动释放池
@autoreleasepool {
// 因为没有调用 autorelease 方法,所以对象没有加入到自动释放池
//内存泄漏
Person *p = [[Person alloc] init];
[p run];
}
@autoreleasepool { // 错误写法, 过度释放 Person *p = [[[[Person alloc] init] autorelease] autorelease]; }
@autoreleasepool { Person *p = [[[Person alloc] init] autorelease]; [p release]; // 错误写法, 过度释放 }
1.使用ARC后,系统会检测出何时需要保持对象,何时需要自动释放对象,何时需要释放对象,编译器会管理好对象的内存,会在何时的地方插入retain, release和autorelease,通过生成正确的代码去自动释放或者保持对象。我们完全不用担心编译器会出错
ARC判断一个对象是否需要释放不是通过引用计数来进行判断的,而是通过强指针
来进行判断的。那么什么是强指针
?
Person *p1 = [[Person alloc] init];
__strong Person *p2 = [[Person alloc] init];
__weak Person *p = [[Person alloc] init];
ARC如何通过强指针来判断?
int main(int argc, const char * argv[]) { // 不用写release, main函数执行完毕后p会被自动释放 Person *p = [[Person alloc] init]; return 0; }
#import <Foundation/Foundation.h>
#import "Car.h"
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) Car *ce;
@end
#import "Person.h"
@implementation Person
- (void)dealloc{
[self.name release];
[self.che release];
[super dealloc];
}
- (void) setName:(NSString *)aName{
//1.先判断是不是新传进来的对象
if (_name != aName){
//2 对旧对象做一次release
[_name release];//若没有旧对象,则没有影响
//3.对新对象做一次retain
_name = [aName retain];
}
}
@end
标签:不可用 count str 获得 16px run 自动 默认 reference
原文地址:https://www.cnblogs.com/jianze/p/9382960.html