object-c的Retain and Release(保留与释放)

【循环retain Objective-C语言】 循环retain Objective-C 阅读详情
          在object-c中,系统自动会为每个创建的对象保存一个引用计数器。当对象被创建时,引用计数设置为1,每一次必须保持该对象时,需要发送(即调用)retain来使得引用计数加1。不再需要对象时,可以发送release消息,使得引用计数减1。当引用计数为0的时候,系统就会释放它的内存(通过向对象发送dealloc消息,也就是真正地去回收对象的内存)。另外,可以用retainCount来得到这个对象的引用计数,返回的类型是NSUInteger整数。基本的调用方式如下:
[obj retain];
[obj release];
[obj retainCount]; 


1. 例子代码:
//1. ClassA.h
#import <Foundation/NSObject.h>


@interface ClassA: NSObject 


@end


//2. ClassA.m
#import "ClassA.h"


@implementation ClassA


//在.h中有声明,不必声明dealloc方法
-(void) dealloc {
    printf( "Deallocing ClassA\n" );
    [super dealloc];
}
@end


//3. main.m
#import <stdio.h>
#import "ClassA.h"


int main( int argc, const char *argv[] ) {
    printf("test case 1:\n");
    ClassA *a1 = [[ClassA alloc] init];
    ClassA *a2 = [[ClassA alloc] init];


    printf( "a1 retain count: %i\n", [a1 retainCount] );
    printf( "a2 retain count: %i\n", [a2 retainCount] );


    printf("test case 2:\n");
    [a1 retain]; // 2
    [a1 retain]; // 3
    [a2 retain]; // 2


    printf( "a1 retain count: %i\n", [a1 retainCount] );
    printf( "a2 retain count: %i\n", [a2 retainCount] );
    
    printf("test case 3:\n");
    [a1 release]; // 2
    [a2 release]; // 1


    printf( "a1 retain count: %i\n", [a1 retainCount] );
    printf( "a2 retain count: %i\n", [a2 retainCount] );
    
    // release
    [a1 release]; // 1  //这里要注意,有几个retain,就要有几个release.
    [a1 release]; // 0  //而且,只调用一次delloc
    [a2 release]; // 0


    return 0;
}


2. 编译运行:
gcc -fconstant-string-class=NSConstantString -c main.m -I /GNUstep/System/Library/Headers
gcc -c ClassA.m -I /GNUstep/System/Library/Headers
gcc main.o ClassA.o -o main -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base


$ ./main.exe
test case 1:
a1 retain count: 1
a2 retain count: 1
test case 2:
a1 retain count: 3
a2 retain count: 2
test case 3:
a1 retain count: 2
a2 retain count: 1
Deallocing ClassA
Deallocing ClassA
 
3. 说明:
  (1). 有几个retain,就要有几个release, 而且,delloc只会被调用一次; 
  (2). 一个原则是,是你自己申请的内存,就得由你来负责释放它;而不是你申请的,请不要随意去释放它,这不是你的责任; 
  (3). 每次retain对象时,应该release或autoreleas它。 
       
从零开始用STM32驱动RGB屏:配置PCLK、DE同步信号的避坑指南 本文详细介绍了如何使用STM32驱动RGB接口LCD屏幕,重点解析了PCLK配置、同步信号极性和DE使能等关键参数的设置方法。通过实战代码示例和常见问题排查指南,帮助开发者避免常见配置错误,实现稳定的显示效果。特别针对800x480 IPS屏提供了优化建议和调试技巧。 阅读详情

相关推荐

手撕代码系列:Conv2D

在实际的神经网络中,每个卷积核都会对应一个偏置值。这意味着如果网络有多个卷积核,每个卷积核的输出都可以加上对应的偏置。

qq_55794606的博客 908

Object_c的retain机制

object-c 使用引用计数的方式管理内存。当我们使用一个指针指向一块内存的时候,应该对这块内存做retain操作,那么引用计数加一。当我们不再使用这个指针指向这块内存,应该对这块内存做release操作,那么引用计数减一。这样可以使引用计数值一直保持等于指向这块内存的指针数量。retainCount返回当前内存的引用计数值。当内存被开辟后,默认的引用计数为1 。 NSObject *obje

zhangchw163的专栏 637

LPDDR5时序精调:深入解析Read Gate Training的两种模式

本文深入解析了LPDDR5内存中关键的Read Gate Training技术,详细对比了RDQS Toggle Mode(翻转模式)与Enhanced RDQS Mode(增强模式)的工作原理、时序参数及适用场景。文章阐述了在高速数据传输下精准校准时序的必要性,并提供了两种模式的实战选型指南与系统级调试思路,帮助工程师优化内存性能与稳定性。

weixin_29219189的博客 365

Objective-C——retain/copy/assign/atomic/nonatomic/strong/weak/readonly/readwrite详解

【atomic/nonatomic】 (1)atomic[默认属性]:OC使用的一种线程保护技术,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。 (2)nonatomic:非原子性访问,属性赋值的时候不加锁,多线程并发访问会提高性能。但可能会造成不安

乞力马扎罗的雪CYF的博客 4378

OpenHarmony自定义Launcher

OpenHarmony源码版本:4.0release开发板:DAYU / rk3568DevEco Studio版本:4.0.0.600切换分支为OpenHarmony-4.0-Release,并下载源码。

Abner_Crazy的博客 1629

数据分析案例-对某宝用户评论做情感分析

目录 原始数据 绘制词云图 情感分析 原始数据 原始数据为某宝一商品的用户评论数据 绘制词云图 # coding=utf-8 import jieba import re import wordcloud import imageio # 打开需要分析词频的文本 with open('淘宝评论3.0.txt', encoding='utf-8') as f: data = f.read() # 文本预处理 :去除一些无用的字符只提取出中文出来 new_data

m0_64336780的博客 1万+

assign,copy,retain -Object-C中纠结的三个属性(retain)

assign,copy,retain 这三个属性在我们申明属性时,经常用到,那么到底时什么东西呢 ?有什么意义呢?那我们就来看清楚把。 开始吧,不废话了,还是用代码说话。 先看assign 的情况,因为只是默认的方式 @property(nonatomic,retain)NSString*name; 那么编译器会生成,相应的get,se...

jacklin_01的博客 284

Python爬招聘网站:Selenium+ActionChains破解滑动验证码,批量采集岗位数据(新手可跑)

通过本文实战,你不仅学会了用Selenium+ActionChains破解滑动验证码,还掌握了爬虫的核心优化思路——“模拟人类行为”是突破反爬的关键。这套逻辑不仅适用于招聘网站,还能迁移到其他有滑动验证码的平台(如电商、资讯网站)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1185

object-c学习:@property (nonatomic,retain)中的nonatom和retain的意思

原文地址::https://blog.youkuaiyun.com/yanfangjin/article/details/7399763 相关文章 1、属性项目的定义(property)----http://c.gzl.name/archives/85 2、nonatomic, retain,weak,strong用法详解----https://blog.youkuaiyun.com/dong_007_007...

xqhrs232的专栏 298

【数据集】2019年中国1km格网河网密度数据集

中国1km格网河网密度数据集

WW、forever的博客 1342

yolov8涨点系列之Concat模块改进

yolov8涨点系列之Concat模块改进

zhang1379的博客 2950

Implementing alloc, retain, release, and dealloc

Implementing alloc, retain, release, and dealloc Many parts of OS X and iOS are publicly available as open source software at Apple Open Source.1 As mentioned above, the alloc, retain, release,

chuanyituoku的专栏 1372

矩阵理论与应用:数理经济学中的投入产出模型分析

1. 背景介绍 矩阵理论是现代数学中的一个重要分支,它在各个领域都有广泛的应用。其中,投入-产出模型是矩阵理论在经济学中的一种应用,它可以用来分析一个国家或地区的经济结构和发展趋势。本文将介绍投入-产出模型的基本概念和原理,并通过实例来说明其应用。 2. 核心概念与联系 投入-产出模型是一

AI天才研究院 1486

Objective-C - retain release autorelease

Objective-C在管理内存时,遵循一套简单的规则。 每一个对象都有一个名为"retainCount"的变量,它表示该对象有多少个引用。 class *obj = [class alloc];//alloc会导致retainCount为1 [obj retain];//retainCount++ 通常在对象赋值之后这样做,代表它多了一个引用。 [obj release];//retai

夏天的学习小站 6939

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【object-c基础】object-c基础之二:property,assign,copy,retain,release

例子: @property(nonatomic,retain) NSString *aString; property:属性的定义,相当于C语言的setter和getter方法。 assign:简单的赋值,不更改索引的计数。 copy:建议一个索引计数为1的对象,

Andy---清风 7159

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

retain和release实现探究

前面一篇文章,我们讲到了系统为了优化数字字符串等类型的数据存储新增了一种NSTaggedPointer类型,同时我们还发现,isa指针在经过优化后,提供了19个bit位用来存储引用计数的个数。但是如果超出了这个限制呢? 引用计数 其实在绝大多数情况下,仅用优化的isa_t来记录对象的引用计数就足够了,但是当对象被引用次数超过 2^19 限制时,就轮到SideTable出场了。 首先,我们先看下超出限制之后,系统是如何将引用计数转移的 retian // 等价于直接使用对象调用retain方法 inline

weixin_43180925的博客 759

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

黑箱中的retain 和 release

在接口设计时,我们经常要考虑某些意义上的平衡。在内存管理中,Objective-C 同时为我们提供了增加引用计数的retain和减少引用计数的release方法。 这篇文章会在源代码层面介绍 Objective-C 中retain和release的实现,它们是如何达到平衡的。 从 retain 开始 如今我们已经进入了全面使用 ARC 的时代,几年前还经常使用的retain和release方法已经很难出现于我们的视野中了,绝大多数内存管理的实现细节都由编译器代劳。 在这里,我...

gcs的博客 563

【iOS】—— retain\release实现原理和属性关键字

首先来看一下retain的源码: 我们根据图来看一下retain步骤:看一下release的源代码: 我们根据图来看一下release步骤:属性关键字是用来修饰属性的关键字,保证程序的正常执行。weak将常用来修饰OC对象数据类型,修饰的对象释放之后,指针会自动置nil,这是弱引用的表现。**在ARC的环境下,为了避免循环引用,delegate往往是用的是weak修饰。在MRC下使用assgin修饰。**当某个对象不再拥有strong类型的指向的时候对象就会被释放,即使还有weak类型的指针指向它,wea

qq_72437394的博客 1192

iOS—从源码分析retain、release、retainCount实现

文章目录isa简单了解sideTables、sideTable 简单了解retainCount实现retain 实现release实现retain、release过程大总结:objc_autoreleaseReturnValue实现objc_retainAutoreleasedReturnValue实现 isa简单了解 每个OC对象都含有一个isa指针,__arm64__之前,isa仅仅是一个指针,保存着对象或类对象内存地址,在__arm64__架构之后,apple对isa进行了优化,变成了一个共用体(un

qq_45836906的博客 1004

理解Stack、Heap并深入实现ObjC中alloc、retain、release与dealloc方法

Stack

Dan_163的专栏 1528

Cocos2dx 之retain ,release

因为功能和接口和objective-c版本的差不多,所以在内存管理上也采用objective-c引用计数的机制来实现内存管理。仔细看了一下cocos2d-x的源代码,确实写的很好,代码组织得很工整。它们所有类都是继承自CCObject, CCObject有retain(), release()和autorelease()等方法,和objective-c上的NSObject用法一致。每当CCObje

专注,努力,勤奋 5914

alloc、retain、release源码解析

在MRC时代,系统判定一个对象是否销毁是根据这个对象的引用计数器来判断的。我们要知道一个对象在内存中内存是如何被管理的,还是需要了解一下MRC。设置Build Setting中的Objective-C Automatic Reference Counting为NO,开启手动管理内存。 #引用计数存放位置 开始本篇源码分析前,我们需要了解引用计数是如何存放的,在上一篇NONPOINTER_ISA和散...

weixin_30326745的博客 260

浅谈cocosd之autorelease\retain\release的理解

三种情况,引出问题: 1)new出来的对象需要释放,而释放时,如果有其他人引用了这个对象,再次使用这个对象时,则会出现野指针情况。 ==> 于是出现了引用计数的释放管理机制。 2) 对于一个返回对象指针的方法,你若不看文档不看内部代码,你无法知道这个指针需不需要你来释放。同样的对于将一个指针或者对象作为参数给一个方法后, 你也无法知道这个方法会不会将你的对象释放掉...

baidui8622的博客 300

内存管理Release和Retain实现原理

引入计数存储在SideTables表中存储结构如图所示。 1.Retain实现原理。 1.1对对象retain之后实现过程。 id objc_object::sidetable_retain() { #if SUPPORT_NONPOINTER_ISA assert(!isa.nonpointer); #endif SideTable& table = SideTables(...

weixin_34008805的博客 452
上一篇: object-c的protocol(协议)
下一篇: object-c的Dealloc
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值