【iOS】alloc、init、new

1. alloc

进入到alloc的源码里面,我们发现alloc调用了_objc_rootAlloc方法,而_objc_rootAlloc调用了callAlloc方法。

objectivec 复制代码
+ (id)alloc {
    return _objc_rootAlloc(self);
}

id _objc_rootAlloc(Class cls)
{
    return callAlloc(cls, false/*checkNil*/, true/*allocWithZone*/);
}

static ALWAYS_INLINE id
callAlloc(Class cls, bool checkNil, bool allocWithZone=false)
{
    if (slowpath(checkNil && !cls)) return nil;

#if __OBJC2__
    if (fastpath(!cls->ISA()->hasCustomAWZ())) {
        if (fastpath(cls->canAllocFast())) {
            // No ctors, raw isa, etc. Go straight to the metal.
            bool dtor = cls->hasCxxDtor();
            id obj = (id)calloc(1, cls->bits.fastInstanceSize());
            if (slowpath(!obj)) return callBadAllocHandler(cls);
            obj->initInstanceIsa(cls, dtor);
            return obj;
        }
        else {
            // Has ctor or raw isa or something. Use the slower path.
            id obj = class_createInstance(cls, 0);
            if (slowpath(!obj)) return callBadAllocHandler(cls);
            return obj;
        }
    }
#endif

    // No shortcuts available.
    if (allocWithZone) return [cls allocWithZone:nil];
    return [cls alloc];
}

具体内容本人暂时也一知半解,贴一张图

alloc为我们创建了1个对象并申请了一块不小于16字节的内存空间

具体可以参考一下这篇博客
博客

2. init

我们进入init的方法源码

objectivec 复制代码
- (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;
}

额的天呐,init啥都没做,只是把当前的对象返回了。既然啥都没做那我们还需要调用init吗?答案是肯定的,其实init就是一个工厂范式,方便开发者自行重写定义。

我们在来看看new方法做了啥。

3. init

我们再看看init的代码

objectivec 复制代码
+ (id)new {
    return [callAlloc(self, false/*checkNil*/) init];
}

init调用的是callAlloc的方法和init,那么可以理解为new实际上是alloc + init的综合体。

4. 总结

  1. alloc创建了对象并且申请了一块不少于16字节的内存空间。
  2. init其实什么也没做,返回了当前的对象。其作用在于提供一个范式,方便开发者自定义。
  3. new其实是alloc+init的一个综合体。
相关推荐
sakiko_7 小时前
UIKit学习笔记4-使用UITableView制作滚动视图
笔记·学习·ios·swift·uikit
小锋学长生活大爆炸10 小时前
【开源软件】这次iPhone也是用上Claw了 | PhoneClaw
ios·开源软件·iphone·claw
SameX14 小时前
独立开发一个把走过的路变成 km² 的 App,聊聊 25m 网格和后台 GPS 的坑
ios
XD74297163615 小时前
科技早报晚报|2026年4月30日:Agent 安全壳、浏览器 iOS 测试台与可穿戴数据 API,今天更值得看的 3 个技术机会
科技·ios·开源项目·科技新闻·开发者工具
北京自在科技18 小时前
Find Hub App 小更新
android·ios·安卓·findmy·airtag
2501_9159214318 小时前
HTTPS前端劫持 新一代流量劫持解决方案
前端·网络协议·ios·小程序·https·uni-app·iphone
911hzh18 小时前
Flutter WebRTC iOS 原理解析:从 getUserMedia 到 Texture,讲清视频采集、纹理渲染与远端通话链路
flutter·ios·webrtc
软泡芙19 小时前
【iOS】 开发入门指南
ios
水中加点糖19 小时前
ios中使用DockKit和CoreML实现自定义目标的自动跟随(一)
目标检测·ios·目标跟踪·硬件控制·dockkit
2501_9159090620 小时前
iOS应用签名的三种方法全解析:从官方到第三方工具
android·ios·小程序·https·uni-app·iphone·webview