内存管理

本文深入探讨Objective-C中的内存管理机制,包括自动引用计数(ARC)与手动引用计数(MRC),并通过实例展示了如何合理使用retain、release、assign等关键字进行内存管理,以及解释了各种关键字(@property)在属性定义中的作用,帮助开发者掌握Objective-C的内存管理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、引用计数
如果内存管理不当
1、不再使用对象没有被回收,内存泄露,最终导致程序闪退
2、正在被使用对象被释放了,野指针,访问野指针就会导致程序崩溃

ARC Automatic Reference Counting 自动引用计数
MRC Manual Reference Counting 手动引用计数

1、当一个对象刚刚出生时候,它的引用计数 1
2、当对象上引用计数是0的时候,系统立即把它回收

3、release 引用计数-1
4、retain 引用计数+1

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

    CZPerson *person = [[CZPerson alloc] init];//1

    long count  = [person retainCount];
    NSLog(@"%zd",count);

    [person retain];//2
    NSLog(@"%zd",[person retainCount]);
    [person release];// 0

    NSLog(@"%zd",[person retainCount]);
    [person release];

//    person = nil;
//  当一个指针指向 nil,这个指针我称为空指针
//  给空指针发送消息系统不会报错,它什么都不做
    [person test];

    [person dealloc];


    NSLog(@"%zd",[person retainCount]);//

    return 0;
}
#import <Foundation/Foundation.h>

@interface CZPerson : NSObject


- (void) test;

@end
#import "CZPerson.h"

@implementation CZPerson


- (void) test
{
    NSLog(@"CZPerson");
}

//永远不要试图自己调用这个方法
-(void) dealloc
{
//   这里可以验证对象是否被回收了

    NSLog(@"CZPerson 回收");

//  这个方法中必须调用父类该方法,并且必须放在最后
    [super dealloc];
}

@end

二、各种关键字(@pr)

#import <Foundation/Foundation.h>
#import "CZRoom.h"
/*
  手动内存管理的关键字
  retain  就再setter 和 getter方法中加入一些内存管理的代码
  当属性是一个普通OC对象的时候,使用retain

  自动内存管理的关键字
  strong 用于普通OC对象
  weak 循环引用,一端必须用weak

  assign  直接赋值,不生成内存管理代码 
  当属性是一个基本数据类型的时候,使用assign
  copy  复制对象,NSString 使用copy

 线程安全
 nonatomic:非原子,不会生成线程安全的代码,速度快,iOS通常都是这种
 atomic:原子(默认),会生成线程安全的代码,速度慢

 控制权限
 readwrite:可读可写,生成getter 与 setter方法是声明与实现
 readonly:只读 只生成getter方法

 修改方法名称
 getter 修改生成的getter方法的名称
        一般情况下,BOOL类型的属性的getter方法是以is开头的
 setter 修改生成的setter方法的名称
        一般不去修改它

 */
@interface CZPerson : NSObject

@property (nonatomic,assign,getter=isMan) BOOL man;

@property (nonatomic,copy) NSString *name;

@property (nonatomic,assign,readonly) int age;

@property (nonatomic,retain) CZRoom  * room;

@end
#import <Foundation/Foundation.h>
#import "CZPerson.h"

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

    CZPerson *p = [[CZPerson alloc] init];

    [p setMyMan:YES];

    BOOL isMan =  p.isMan;


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值