社区首页 >问答首页 >目标C中的init实际上是做什么的?

目标C中的init实际上是做什么的?
EN

Stack Overflow用户
提问于 2014-06-01 12:18:59
回答 2查看 364关注 0票数 4
代码语言:javascript
代码运行次数:0
复制
+ (id)alloc;

代码语言:javascript
代码运行次数:0
复制
- (id)init;

是NSObject.h中的方法

异种动物

代码语言:javascript
代码运行次数:0
复制
+ (id)alloc {
    return _objc_rootAlloc(self);
}


id
_objc_rootAlloc(Class cls)
{
#if 0  &&  __OBJC2__
    // Skip over the +allocWithZone: call if the class doesn't override it.
    // fixme not - this breaks ObjectAlloc
    if (! ((class_t *)cls)->isa->hasCustomAWZ()) {
        return class_createInstance(cls, 0);
    }
#endif
    return [cls allocWithZone: nil];
}

它执行内存分配,并返回类实例。

但是当我谈到init方法时,这是实现

代码语言:javascript
代码运行次数:0
复制
- (id)init {
    return _objc_rootInit(self);
}

id
_objc_rootInit(id obj)
{
    // In practice, it will be hard to rely on this function.
    // Many classes do not properly chain -init calls.
    return obj;
}

它只返回self对象(NSObject),而不进行任何初始化。

这些文档也说明了同样的问题。

“在NSObject类中定义的init方法不进行初始化;它只是返回self。”

如果是这样的话,只有alloc方法就足够了。Init方法仅用于过脊。

这里有什么解释吗?

这是实现源NSObject.mm

http://www.opensource.apple.com/source/objc4/objc4-532/runtime/NSObject.mm

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-01 12:36:09

alloc与内存分配有关,而init (或initX等,init系列)则是在创建对象时根据需要配置所分配的内存--无论是现在还是将来某个修订之后的任何特定类,都需要在init中进行任何工作,这取决于该类的语义。但是,对于任何任意类,您都不知道它是否是init,因此必须调用它,而且由于任意类都不知道它的超类是否需要进行初始化,所以必须在自己的init中调用它的超类init。要使这个链工作,NSObject必须有一个init,碰巧它(目前,谁知道将来)不起作用。NSObjectinit是链的末端,也是唯一不需要调用另一个init的。

由于许多语言将分配和初始化这两种操作合并为一个不可分割的操作,例如new中的Java,因此出现了一些混乱。实际上,Cocoa还有一个new,它被定义为alloc,后面跟着init

苹果公司真的应该这样写:

NSObject类中定义的init方法目前不进行初始化;它只是返回self。

或者干脆什么都没说。

HTH

票数 5
EN

Stack Overflow用户

发布于 2014-06-01 16:26:14

CRD解释得很好。

不过,我会更有力地说明这一点。

在目标C中创建新对象的方法是使用alloc/init。

您应该始终初始化每个对象,并且自定义init方法应该始终调用[super init]。考虑在所有对象上调用init失败是一个错误,并考虑在自定义init方法中调用[super init]为一个错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23984096

复制
相关文章
kafka 中 zookeeper 具体是做什么的?
zookeeper 是 kafka 不可分割的一部分,可见其重要程度,所以我们有必要了解一下 zookeeper 在 kafka 中的具体工作内容。
dys
2019/12/15
1.7K0
做SaaS,实际上就是旧城改造
来源:ToB老人家|作者:王戴明  ---- SaaS的4条护城河 周末到一家非常优秀的SaaS公司交流。他们深耕某垂直领域,刚完成一笔数亿元的融资。 公司创始人给我说:他正在评估一个新的垂直领域。但让他纠结的是,这个领域已经有多家SaaS公司竞争,其中还有一家上市公司。对他来说,如果不能做到垂直领域的第一,那么还不如不做。 他的观点我颇为赞同。其实,对创业者来说,竞争并不可怕,上市公司也不足为惧,真正可怕的是:创业者没有想明白自己的护城河在哪里。一家没有护城河的SaaS公司,不要说应
腾讯SaaS加速器
2021/06/08
4160
在Hadoop中Container是干什么的?
Container:马 克-to-win @ 马克java社区:前面我们总提资源分配。而资源分配的体现就要用到一个抽象概念“容器”(Container)表示,Container将内存、 CPU、磁盘、网络等资源封装在一起,这样可以起到限定资源边界的作用。比如给你一个Container的资源,里面包含3个G的内存,1G硬盘。当销毁 你的Container时,连带的内存,硬盘都没有了。
马克java社区
2021/06/24
7690
在Hadoop中ResourceManager是干什么的?
ResourceManager:马克-to-win @ 马克java社区:防盗版实名手机尾号:73203。当应用程序对集群资源需求时,ResourceManager是Yarn集群主控节点,负责协调和管理整个集群(所有NodeManager)的资源。
马克java社区
2021/06/24
8710
在Hadoop中NodeManager是干什么的?
NodeManager:马克-to-win @ 马克java社区:NodeManager管理一个YARN集群中的每一个节点。比如监视资源使用情况( CPU,内存,硬盘,网络),跟踪节点健康等。
马克java社区
2021/06/24
8250
在Hadoop中ApplicationMaster是干什么的?
ApplicationMaster:马 克-to-win @ 马克java社区:想了解ApplicationMaster,我们需要了解一下它工作的过程。 用户向YARN集群提交应用程序时:(包含ApplicationMaster程序,ApplicationMaster启动命令,用户自己的程序)后, ApplicationMaster向资源调度器申请执行任务的资源容器Container,运行用户自己的程序任务job(我们可以用浏览器看yarn 里的job进展),监控整个任务的执行,跟踪整个任务的状态,处理任务失败以异常情况。
马克java社区
2021/06/24
1K0
链路层是做什么的?
最大传输单元。链路层[以太网(1500字节)和802.3(1492字节)]对数据帧的长度存在限制。
爬蜥
2019/07/09
1.3K0
java中trim()方法是用来干什么的?
trim()的作用是去掉字符串两端的多余的空格,注意,是两端的空格,且无论两端的空格有多少个都会去掉,当然中间的那些空格不会被去掉,如:
瑞新
2020/07/07
1.3K0
docker是啥?是干什么的?
docker有3大核心:镜像、容器、仓库。 鲸鱼是操作系统。 要交付的应用程序是各种货物,要将各种形状和尺寸不同的货物放到大鲸鱼上,得考虑每件货物怎么安放(应用程序配套的环境),还得考虑货物和货物之间能否重叠起来(应用程序依赖的环境是否会冲突)。 现在使用了集装箱(容器)把每件货物都放到集装箱里,这样大鲸鱼可以用同样地方式安放、堆叠集装了,省事省力。 即:打包放到鲸鱼上,鲸鱼放到服务器上。也就是“build——ship——run”,这样在自己的电脑上怎么运行,在服务器上也会怎么运行。 用docker运行一个程序的过程: 去仓库把镜像拉到本地,然后用一条命令把镜像运行起来,变成容器。
兔子吖
2019/10/14
1.5K0
docker是啥?是干什么的?
大数据开发是干什么的(大数据开发是做什么的)
据数联寻英发布《大数据人才报告》显示,目前全国的大数据人才仅46万,未来3-5年内大数据人才的缺口将高达150万,越来越多人加入到大数据培训,都希望在大数据培训机构中学习最前沿的知识,找一份不错的工作。
全栈程序员站长
2022/07/31
1.3K0
都知道这么做是对的,但是能说为什么的没多少 ...
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。
宫水三叶的刷题日记
2021/02/26
3.3K0
C#9.0:Init
在以前的C#版本里面,如果需要定义一个不可修改的的类型的做法一般是:声明为readonly,并设置为只包含get访问器,不包含set访问器。如下:
用户9127601
2021/11/01
3470
c语言目标程序中的段
段的分类 根据C语言的特点,每一个源程序生成的目标代码将包含源程序所需要表达的所有信息和功能。目标代码中各段生成情况如下:
用户4766018
2022/08/19
1.4K0
Actor模型是做什么的?
问题 用户A的操作 (1)开始事务 (2)操作资源1 (3)操作资源2 (4)提交事务 用户B的操作 (1)开始事务 (2)操作资源2 (3)操作资源1 (4)提交事务 如果用户A和用户B的两个事务同时发生,A锁住了资源1,B锁住了资源2,互相等待,陷入死锁 如果采用同步锁synchronized,可能会出现破坏逻辑一致性的问题 这个问题的根本原因:数据是被动的被处理 在读多写少,较少涉及事务机制的场景下,这个问题不明显,否则就面临此问题 Actor模型 Actor模型就是用来解决事务
dys
2018/04/03
1.3K0
serialVersionUID 是干什么的?
我们有时候在写代码的时候,对于一个需要序列化的类,如果不去写 serialVersionUID,编译器可能就会提示我们 The serializable class ClassName does not declare a static final serialVersionUID field of type long。
做棵大树
2022/09/27
1.3K0
Docker是用来干什么的?
Docker目前只能在Linux下运行 下面的例子我自己经常使用,当然你有更好的案例也可以分享给我。
爱吃大橘
2022/12/27
1.2K0
csproj 文件中那个空的 NuGetPackageImportStamp 是干什么的?
当我们在传统格式的 csproj 项目文件中安装 NuGet 包后,有时会在项目文件中发现空的 NuGetPackageImportStamp 节点。这个空的节点让我们这波强迫症患者觉得有点难以接受,关键是手工删除之后也没发现有什么副作用。
walterlv
2023/10/22
2890
csproj 文件中那个空的 NuGetPackageImportStamp 是干什么的?
数据产品经理是做什么的?
作为一名 B 端产品经理,一直致力于研究企业内部效率工具的实施与搭建,热衷于使用以数据指标为引擎的各类增长方法。应该说,平时我的工作方法与数据产品经理非常接近,今天看到这道题,忍不住顺手答一下,很多想法不太成熟,还请数据大佬们轻拍。
蒋川
2021/08/10
1.3K0
数据产品经理是做什么的?
点击加载更多

相似问题

class_addProtocol在目标C中实际上是做什么的?

11

alloc和init它们实际上是做什么的

55

“为ipad更新当前目标”实际上是做什么的?

31

Ruby:解包(“C”)实际上是做什么的?

25

目标-c中的协议是谁做的?

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档