Objective-C - 自动引用计数器

引用计数器的基本操作

/*
 1.方法的基本使用
 1> retain :计数器+1,会返回对象本身
 2> release :计数器-1,没有返回值
 3> retainCount :获取当前的计数器
 4> dealloc
  * 当一个对象要被回收的时候,就会调用
  * 一定要调用[super dealloc],这句调用要放在最后面

 2.概念
 1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用
 2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
 3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错

 */

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

int main()
{
    // 1
    Person *p = [[Person alloc] init];

    //NSUInteger c = [p retainCount];

    //NSLog(@"计数器:%ld", c);

    // 2 retain方法返回的是对象本身
    [p retain];

    // 1
    [p release];

    // 0 野指针:指向僵尸对象(不可用内存)的指针
    [p release];

    [p retain];

    // -[Person setAge:]: message sent to deallocated instance 0x100109a10
    // 给已经释放的对象发送了一条-setAge:消息:
    p.age = 10;
    //[p setAge:10];

    // 指针p变成空指针
    //p = nil;

    // EXC_BAD_ACCESS : 访问了一块坏的内存(已经被回收、已经不可用的内存
    // 野指针错误
    // OC不存在空指针错误,给空指针发送消息,不报错
    [p release];
    [p release];
    [p release];
    [p release];

    [nil release];

    return 0;
}

@interface Person : NSObject

@property int age;

@end
#import "Person.h"

@implementation Person

// 当一个Person对象被回收的时候,就会自动调用这个方法
- (void)dealloc
{
    NSLog(@"Person对象被回收");

    // super的dealloc一定要调用,而且放在最后面
    [super dealloc];
}

@end
时间: 2024-08-01 11:56:02

Objective-C - 自动引用计数器的相关文章

OC_自动引用计数器_0x08

ARC是“由编译器进行内存管理”的,但实际上只有编译器是无法完全胜任的,在此基础上还需要Objective-C运行时库的协助.也就是说,ARC由以下工具.库来实现. 1)clang(LLVM编译器)3.0以上: 2)objc4 Objective-C运行时库493.9以上: id __strong obj = [[NSObject alloc] init] /*编译器的模拟代码*/ id obj = objc_msgSend(NSObject, @selector(alloc)); objc_m

OC_自动引用计数器_0x05

autorelease具体使用方法如下: 1)生成并持有NSAutoreleasePool对象: 2)调用已分配对象的autorelease实例方法: 3)废弃NSAutoreleasePool对象. autorelease是怎样实现的呢?来插卡GNUstep的源代码. [obj autorelease]; - (id)autorelease { [NSAutoreleasePool addObject:self]; } autorelease实例方法的本质就是调用NSAutoreleasePo

ARC自动引用计数

启动自动引用计数选项. 选择项目的属性文件 --> 搜索 automatic Reference --> Objective-C Automatic Reference Counting --> Yes ARC 和手动管理内存的区别. ARC 并不是GC在运行中判断引用计数是否为0,从而清除内存.而是在代码编译之前通过静态分析工具Analyze自动生成内存管理代码. 开启ARC后,不能再使用retain等系列手动内存管的方法,可以重写dealloc方法但不能再方法中[super deal

黑马程序员-内存管理之引用计数器

1.引用计数器 每种语言都有自己的内存管理机制,当然OC也不例外.当一个对象创建的时候,系统在堆中给这个对象分配了一块存储区域,这个对象被栈中的对象指针所指向,当没有任何指针指向这个对象的时候,系统怎么释放这块对象内存呢?OC中是用引用计数器来实现的.每一个对象拥有一个引用计数器(占四个字节),当对象被创建时,自带的引用计数器的值就为1了.给对象发送retain消息时,对象的引用计数器就做+1操作,表示有指针拥有这个对象,发送release消息时引用计数器做-1操作,表示某个指针不在拥有这个对象

内存管理(简介,引用计数器)

移动设备的内存及其有限,每个app所占的内存是有限制的 下列行为都会增加一个app的内存占用 1,创建一个OC对象 2,定义一个变量 3,调用一个函数或者方法 当app所占用的内存比较多时,系统会发出内存警告,这时得回收一些不需要再使用的空间.比如回收一些不需要使用的对象,变量等. 如果app占用内存过大: 系统可能会强制关闭app,造成闪退现象,影响用户体验. 所谓内存管理,就是对内存进行管理,涉及的操作有: 分配内存:比如创建一个对象,会增加内存占用 清楚内存:比如销毁一个对象,能减小内存占

oc中设置手动引用和自动引用图解

1.把整个工程都设为手动引用 ----------------------------选中MRCAPP  再找到bulid settings------------------ ---------------------------------------在搜索框中输入arc---------------------------------------------------- 2.设置某个类手动引用 选中某个需要设置的类 然后双击     会跳出对话框  在里面输入:“-fno-abjc-ar

手动和自动引用计数小结

自动引用计数:(arc)自动去释放掉你声明的,但是你用完了的对象内存. 手动引用计数:(mrc)需要手动去释放掉,你自己声明的对象. 现在的xcode是自动引用计数,但是你可以调用配件,将你的整个工程,或其中的某个.m变成手动引用计数. 将整个工程变成手动引用计数的步骤为: 1 2 3 4 将某个.m文件变成手动引用计数的步骤为: 在你所需要把自动引用计数变为手动引用计数的.m文件后面的  compiler flags中 写入-fno-objc-arc就可以了,写入-fobjc-arc则是自动引

写时拷贝 引用计数器模型

1.深浅拷贝的使用时机: 浅拷贝:对只读数据共用一份空间,且只释放一次空间: 深拷贝:数据的修改,的不同空间: 2.引用计数器模型 使用变量use_count,来记载初始化对象个数: (1).static模型(此处只用浅拷贝与浅赋值) #include<iostream> #include<string.h> #include<malloc.h> using namespace std; class String{ public:     String(const ch

进击的雨燕--------------自动引用计数

Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存.通常情况下,Swift 内存管理机制会一直起作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用的内存. 然而,在少数情况下,ARC 为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息.本章描述了这些情况,并且为你示范怎样启用 ARC 来管理你的应用程序的内存. 注意:引用计数仅仅应用于类的实例.结构体和枚举类型是值类型,不是引用类型,也不是通过引用的方式存储和传递. 自动引用计数的工