黑马程序员——oc加强学习(内存管理)

内存管理的原则 :

            1:如果对象有人在使用,那么就不应该回收。如果你想使用这个对象,就应该让这个对象retain一次。如果你不想用这个对象了,就应该让这个对象release一次。

            2:谁创建 谁release (哪个对象创建了空间,那个对象就release)

            3:谁retain 谁release (哪个对象的空间引用计数器retain了,哪个对象就release)

引用计数器

用来保存当前对象有几个东西在使用它(数字)

用来判断对象是否应该回收内存空间(如果对象不等于nil,当引用计数器为0,此时要回收对象的内存空间)

操作

retain 使得引用计数器+1

release 使得引用计数器-1

retainCount 得到引用计数器的值

如果一个对象被释放的时候,会有“临终遗言”(会调用该对象的dealloc方法)

dealloc方法是NSObject的,一般我们要重写dealloc方法

在dealloc方法内部,要调用[super dealloc];

@implementation Person

-(void)dealloc{

    NSLog(@"dealloc");
    
    [super dealloc];
}

@end


#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //相当于retain一次
        Person *p = [Person new];
        
        //获得对象的引用计数
        NSUInteger count = [p retainCount]; //count =1
        NSLog(@"count=%lu",count);
        
        [p retain];
        NSLog(@"count = %lu",[p retainCount]);//count = 2
    
        //retain一次,就要release一次
        [p release];
        [p release];
    
    }
    
    return 0;
}


内存管理研究的内容:

             1:野指针:定义的指针变量没有初始化或者是指向的空间已经被释放。

             2:内存泄露:如果栈区的指针变量已经被释放了,而堆区的空间还没有释放,堆区的空间就被泄露。

单个对象的内存管理(野指针):

              1:野指针错误:访问了一块坏的内存(已经被回收的不可用的内存)。

              2:僵尸对象:所占内存已经被回收的对象,  僵尸对象不能再被使用。

              3:空指针:对象值为空,没有指向任何东西的指针,给空指针发送消息不会报错。

                   nil: 表示对象的值 

                   NIL:表示类的值 

                   NULL:通用指针(泛型指针)

                  [NSNull null]: 是一个对象,他用在不能使用nil的场合 

               4: 当一个对象的空间被释放了,引用计数器为0,这个对象是僵尸对象,如果再用[对象名  retain]方法是不行的

set方法内存管理标准写法

-(void)setCar:(Car *)car{
    
    if (_car != car) {
    
        [_car release];
        
        _car = [car retain];
    
    }
    
}

 @property参数的使用

        


#import <Foundation/Foundation.h>

@interface Dog : NSObject

@property (nonatomic,assign)int tuiNum;

@end

ARC的概念

强指针:默认的情况下,所有的指针都是强指针,关机子strong

弱指针:__weak关键字修饰的指针

在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写retain,release和autorelease

三个关键字就好~这是ARC的基本原则。

ARC的工作原理

在代码编译时为你自动在合适的位置插入release或autorelease。

ARC的判断准则

只要没有强指针指向对象,对象就会被释放

注意:当使用ARC的时候,暂时忘记“引用计数器”,因为判断标准变了。

ARC特点总结

1、不允许调用release,retain,retainCount

2、允许重写dealloc,但是不允许调用[super dealloc]

3、@property

strong :相当于原来的retain(适用于oc对象),成员变量是强指针

weak  :相当于原来的assign(适用于oc对象),成员变量是弱指针

assign :适用于非oc对象类型(基础类型)

ARC使用注意事项

1、ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作。

2、 __weak Person *p =[[Person alloc] init]  不合理,对象一创建处理啊就被释放掉,对象释放掉后,ARC把指针设置为nil

3、


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值