[iOS] 关于 self = [super init];

S32K144 ADC硬件触发实战:PDB与TRGMUX配置避坑指南 本文深入解析了S32K144微控制器中ADC硬件触发的两种核心方案:PDB与TRGMUX。通过对比其架构差异、详细配置流程及常见问题排查,提供了从寄存器操作到DMA联动的完整优化指南,旨在帮助开发者解决多通道采样时序不稳、CPU负载过高等实际难题,实现高效稳定的数据采集。 阅读详情

先看一下官方文档给出的初始化示例代码:

- (id)init {
    self = [super init];  // Call a designated initializer here.
    if (self != nil) {
          // 省略其他细节
    }
    return self;
}

容易让人困惑的地方在于,将父类初始化之后,将其返回的对象指针覆盖当前对象的指针。

这种方式令人费解,目前暂时找不到官方解释这么做的原因。

官方文档 有解释。

我们先分以下几种情况分别分析:(假设superSelf是[super init]的返回值)

1 superSelf == nil

     此时父类初始化失败,self随之被赋值为nil并返回,表现正常。

2 superSelf == self

     大部分类的初始化都是这个结果。此时赋值没有任何影响。 

3 superSelf != self

     这种情况正是大部分人疑惑的地方。执行self = [super init]之后,

     我们创建的对象将会被重定向到另外一块内存上。接下来重点解释这种情况。


首先,出现父类指针跟子类指针不一样的情况其实就是父类的init方法返回的对象跟原先创建的对象不一样,分为以下几种:

1 单件。

     此时如果执行self = [super init]将使所有子类指向这个单件的内存。

     这不仅使所有子类互相修改数据,甚至访问子类自己增加的变量的时候,可能会崩溃。

     建议不要继承单件、或者保证单件的子类也是单件。

2 ClassClusters(类簇),初始化方法返回了不同的子类。

     以下是对象初始化后,返回不同的子类的例子:

NSString *str1 = [NSString alloc];
NSString *str2 = [str1 initWithString:@"hello"];

上面的str1和str2是不一样的对象,存在于不同的内存块中,在GNUStep里面,str1是GSPlaceholderString对象,str2是GSCInlineString对象。

3 共享。

     先看例子:

NSNumber *n1 = [[NSNumber alloc] initWithInt:1];
NSNumber *n2 = [[NSNumber alloc] initWithInt:1];

以上的n1和n2,指向了同一块内存!

由于NSNumber是创建之后就不能修改的对象,所以Foundation在这里做了一些优化,相同数值的NSNumber对象将共享同一块内存。

4 父类可能在初始化中释放了当前的对象并创建了新的内存区域。

这时,子类需要将self指向新的内存区域才能正常工作。所以一定要执行self = [super init];


总结:

在初始化方法中使用self = [super init]语句是Objective-C的标准做法。

一般情况下都要用以上语句来防止父类改变对象的内存地址导致self指针指向无效内存。

在父类是单件、类簇或者有共享资源的时候,必须依照实际情况考虑是否加上这行代码。

总之,当需要继承父类的时候,调用父类的init之前,必须知道父类的init方法的工作方式。

智能化运维(AIOps) • 调查显示,54.79%的企业当前着重关注智能运维的质量领域(包括异常检测、告警收敛、根因分析、 故障处置等)能力建设,其次45.77%的企业关注效率领域,45.49%的企业关注成本领域,30.82%的 企业关注安全领域。从目前的发展情况来看,现阶段AIOps能力大多集中在L2级别, 主要以系统辅助分析,帮助人工进行决策和操作为主,较为领先的 能力实践可以达到L3级别,而L4和L5级别随着AIOps的技术发展 和能力的逐步增强,将是未来智能运维能力建设的发展方向和目标。 阅读详情

相关推荐

当Flowable遇上AI:智能流程决策的未来探索

本文探讨了Flowable工作流引擎与AI技术的融合,构建智能流程决策系统的前沿实践。通过动态流程控制、机器学习优化表达式、自然语言生成规则等创新方法,显著提升业务流程的自动化水平和决策效率。重点解析了AI如何赋能Flowable核心引擎,实现从静态规则到动态智能的跨越式发展。

weixin_29271053的博客 392

self = [super init]

self = [super init]

鱼龙变的博客 664

Android 16(API 36)状态栏颜色适配全攻略:从沉浸式到自定义背景

本文全面解析Android 16(API 36)强制沉浸式状态栏带来的适配挑战,提供了从FrameLayout包裹法到动态修改Window背景色的核心解决方案。针对传统状态栏颜色设置失效问题,详细阐述了如何利用WindowInsets API实现自定义背景,并涵盖全屏模式、Fragment切换及第三方ROM兼容性等实战场景,为开发者提供一站式适配指南。

weixin_29227425的博客 594

对 self = [super init] 的理解

最近学习Objective-C,鉴于所有语言入门级讲解,对一些语法点讲解不够透彻,因此觉得有必要对一些语法点进行记录。 假如有两个类A,B,A继承于B,即A是B的派生类,对A进行初始化如下: A *a = [[A alloc] init]; 这行代码的含义是,类A产生一个对象,为对象分配内存(alloc),然后在调用 初始化方法。这是a指针的内存状态如下 self = [super

huariylee的博客 632

从厘米级到公里级:北斗网格10级精度在ArcPro中的完整应用指南

本文提供了北斗网格十级精度体系在ArcGIS Pro中的完整应用指南。详细解析了从660公里到1.5厘米的十级网格尺度及其编码逻辑,并重点演示了如何在ArcPro中生成网格、计算编码,以及根据项目需求(如滑坡监测)选择合适精度层级的实战策略。指南旨在帮助GIS专业人士利用这套统一的网格框架,高效管理多尺度空间数据并优化分析工作流。

Black的专栏 471

debian mirrors 镜像源 riscv 64 赛昉 星光 starfive vf2 InRelease‘ doesn‘t support architecture ‘riscv64‘

debian mirrors 镜像 riscv 64 赛昉 星光2 starfive vf2 InRelease' doesn't support architecture 'riscv64'

qq_29758759的博客 1258

self = [super init]的解释

在Object-C中我们很多时候都会重写init方法。一般情况下我们都会这样写: -(instancetype)initWithDic:(NSDictionary *)dic{ if(self=[super init]){ code } return self; } 我们来分析下: 1.[super i...

weixin_30590285的博客 146

STM32G070xx将Flash页分块方式存储,固定数据块存储,实现一次擦除多次写入

本例程使用STM32G070xx芯片,Flash大小128KB,Flash每页(2048字节)写满后再擦除。操作存储区分为64块,每块32字节,即写满64次擦除一次;标定存储区分为16块,每块128字节,即写满16次擦除一次,每个存储区的块都有各自的头部标记

RaphaelCeo的博客 1545

[iOS] 关于 self = [super init];

[iOS]关于self=[superinit]; 先看一下官方文档给出的初始化示例代码: [plain] view plaincopyprint? - (id)init { self = [super init]; // Call a designated initializer here. if (self != nil) { // 省略其他细节 } return self; } 容易让人困惑的地方在于,将父类初始化之后,将其返回的对象指针覆盖当前对象的指针。 这种方式令人...

Michae_8l的博客 209

从零构建Fama-French多因子模型:量化投资系统开发实战

本文详细介绍了如何从零构建Fama-French多因子模型,并将其应用于量化投资系统的开发。首先,文章概述了Fama-French多因子模型的背景、核心原理和架构,解释了其如何通过引入市场风险、规模、价值、盈利和投资等因子来解释股票收益率的变化。接着,文章详细阐述了构建该模型的具体步骤,包括因子的计算、因子暴露的确定以及模型的估计。通过数学模型和公式,文章对模型进行了理论推导,并举例说明了其应用。此外,文章还提供了项目实战的代码案例,从开发环境搭建到源代码实现,逐步指导读者完成量化投资系统的开发。最后,文章

2501_92132293的博客 1226

2026 最新安全 Skill 合集(CTF / 审计 / 渗透 / 红队)威胁建模一网打尽

2026年安全领域进入"Skill化"时代,各类安全能力被结构化封装为可复用的AI Skill。本文介绍了7个核心安全Skill项目:渗透测试全流程的AgentSkillsHub、CTF解题技能库ctfskills、多语言代码审计工具codeaudit、PHP专项审计系统、Java自动化审计流水线、威胁建模工具threatmodeling以及覆盖30+领域的Anthropic-Cybersecurity-Skills。这些项目将传统安全经验转化为标准化、可验证、可自动执行的模块化能力,支

Chengbei11的博客 1868

iOS self 和 super区别以及为什么要self = [super init];

联系人:石虎 QQ:1224614774昵称:嗡嘛呢叭咪哄 QQ群:807236138群称:iOS 技术交流学习群 一、self和super区别 区别: - self调用自己方法,super调用父类方法 - self是类,super是预编译指令 - self class】和【super class】输出是...

石虎 3143

人工智能算法面试大总结-总目录

涉及秋招、春招、社招

啥都生的博客 2万+

IOS self = [super init];

https://www.jianshu.com/p/9b36e1b636d8

li198847的博客 362

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

iOS 之self = [super init]

Objective-C的推荐init方法写法如下: - (id) init { if(self = [super init]) { //为子类增加属性进行初始化 } return self; } 返回值为id类型,id类型可以赋值给其他类型指针,其他类型指针也可以赋值给id类型 obc中子类指针不能直接赋值给父类指针 [super ini

Shicuf的专栏 312

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

iOS self = [super init]

self = [super init] 这个问题一直不太明白,今天研究了一下,在stackoverflow找到了下面的答案: http://stackoverflow.com/questions/2956943/why-should-i-call-self-super-init 我对这些答案简单翻译总结下: 要明白这个问题,首先要知道self 是什么东西,我们什么时候会用到self。 se...

weixin_30262255的博客 166

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

iOS : self = [super init] 的理解

这是容错处理,当父类(super) 初始化失败的时候,会返回 nil,表明为初始化失败。由于继承的原因,子类是需要拥有父类的实例和行为,因此,我们必须先初始化父类,然后再初始化子类。...

qq_33485734的博客 482

iOS学习笔记:关于if(self=[super init])

[super init]:父类初始化成功的话,通过=给self,这样self成为一个非空对象,整个来说即非false(非NO)。 于是也就变成了: if ( !false ){ //成功初始化后执行的代码 } 如果init失败 self则为空 if条件为假 于是if段内语句不执行

盛夏LL 1196

【转】[iOS] 关于 self = [super init];

http://blog.youkuaiyun.com/wihing/article/details/7316041

weixin_34367845的博客 81

iOS学习笔记01—初始化对象

iOS学习笔记01—初始化对象 1、关于alloc和init嵌套调用: // 我们总是以如下方式嵌套alloc和init调用,为什么? CExample *example1 = [[CExample alloc] init]; // 而不是像下面这样调用 CExample *example2 = [CExample alloc]; [example2 i

jjunjoe的专栏 1395

self = [super init]的解释与潜藏bug

[Obj-C笔记] "self = [super init]"的解释与潜藏bug 转自:点击打开链接 Objective-C的推荐init方法写法如下: - (id) init { if(self = [super init]) { //为子类增加属性进行初始化 } return self; } 这里涉及了几个问题,

bask2009的专栏 557

Objective-C中init函数实现的相关研究 if ((self = [super init]) != nil)

<br /> <br /> <br />/******************************************************************************<br />本文转载自优快云博客:http://blog.youkuaiyun.com/Cheng_Tian/archive/2010/07/16/5740831.aspx<br /><br /> ***************************************************************

iphoneing的专栏 2078
上一篇: [iOS] ViewController的生命周期及其加载View的步骤
下一篇: 《View Controller Programming Guide for iOS》笔记
wihing
博客等级 码龄19年 55粉丝 36原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值