OC第四讲内存管理

第一题

定义两个类,借用retainCount和dealloc方法测试以下内存管理方法:

alloc、retain、copy、release、autorelease。


内存管理的方式分为:MRC(手动)和ARC(自动)。

使用alloc、retain、copy引用计数(retainCount)加一

使用release引用计数(retainCount)立即减一

使用autorelease引用计数(retainCount)在@autoreleasepool{}结束后减一


如果定义便利构造器如下:

/// 便利构造器
+ (id)personWithName:(NSString *)name
{
    return [[[Person alloc] initWithName:name] autorelease];
}

       这里使用了alloc申请,autorelease释放,在主函数里就不用再释放对象所申请的空间。

在主函数里如果alloc或retain或copy一个对象空间,就必须有对应的release或者autorelease进行释放。


主函数main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Person *p1 = [Person personWithName:@"明明"];
        Person *p2 = [Person personWithName:@"菲菲"];
        NSLog(@"%lu", [p1 retainCount]);       // p1申请alloc一个内存,引用计数加一
        Person *p3 = [p2 retain];              // 给p3分配钥匙,p3和p2一同指向p2的对象
        NSLog(@"%lu", [p3 retainCount]);       // p3引用计数为2,因为p2和p3一共两个
        [p3 release];                          // 释放p2的内存
        p2 = nil;                              // p2置空,防止p2成为野指针
        NSLog(@"%lu", [p2 retainCount]);       // p2为空,引用计数为零
        NSLog(@"%lu", [p3 retainCount]);       // p3的引用计数减一
        
        Person *p4 = [p1 copy];                // p4复制p1
        [p4 autorelease];                      // 释放p4
        
        Student *s1 = [Student studentWithName:@"楠楠" school:@"蓝欧"];
        NSLog(@"%lu", [s1 retainCount]);
        [s1 retain];
        NSLog(@"%lu", [s1 retainCount]);
        [s1 release];
        NSLog(@"%lu", [s1 retainCount]);
        
    }
    // 当引用计数retainCount为零时,自动调用dealloc函数
    // 便利构造器中自带autorelease(自动释放)@autoreleasepool{}结束后内存空间回收
    return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值