首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Objective-C中的alloc,init和new

Objective-C中的alloc, init和new是用于对象的创建和初始化的关键字。

  1. alloc:分配内存空间。

Objective-C中的对象是基于C语言的结构体实现的,因此在创建对象之前需要为其分配内存空间。alloc关键字用于分配内存空间,它返回一个指向对象的指针,该对象的内存空间已经被分配,但是还没有被初始化。

  1. init:初始化对象。

init关键字用于初始化对象。在调用init之前,需要先调用alloc分配内存空间。init方法会将对象的属性设置为默认值,并执行其他必要的初始化操作。

  1. new:分配内存空间并初始化对象。

new关键字是alloc和init的组合,它会自动调用alloc和init方法,分配内存空间并初始化对象。

以下是一个Objective-C中创建对象的示例:

代码语言:txt
复制
NSString *str = [[NSString alloc] init];

或者

代码语言:txt
复制
NSString *str = [NSString new];

总结:Objective-C中的alloc, init和new关键字用于对象的创建和初始化。alloc关键字用于分配内存空间,init关键字用于初始化对象,new关键字是alloc和init的组合,用于分配内存空间并初始化对象。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

OC底层探索03-常用的alloc,init,new到底做了什么?OC底层探索03-常用的alloc,init,new到底做了什么?

前言:想必大家对于[xxx alloc] init]非常熟悉了,都知道是创建一个xxx的对象,但是OC底层到底做了什么?...->callAlloc->alloc,为什么会进入_objc_alloc而不是调用的alloc这就要涉及到llvm中的知识,后续有机会再来解释,可以简单理解为llvm做了一次类似于hook的操作,将alloc...} 事实上init方法并没有做任何事情,也应证之前的猜想: 内存空间是由alloc负责申请,从这个角度看init并没处理任何动作 apple苹果这样设计的目的:类似工厂方法,为后续自定义做一些处理提供一个入口...new做了什么 一般在开发中,初始化除了init,还会使用new,通过源码来看两者本质上并没有什么区别 + (id)new { retur [callAlloc(self, false/*checkNil...*/) init]; } 但是在一般的开发中,如果使用自定的类,这里并不建议使用new,因为这里系统只会调用init方法,对于自定义的initWhitXXX并不会调用。

80540
  • Python类中的__new__和__init__的区别

    在写Python类时,或者看某些项目源码时,总是见到__init__和__new__方法,一直没有深入研究两者的区别,今天聊聊这个。 __new__ __new__是类(class)方法。...class新创建实例时,会调用__new__,它主要控制一个新实例的创建。 需要知道的是,__new__是实例创建的第一步。首先调用它,再由它负责返回类的新实例。...针对__new__的用法,举个栗子: 依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径...通过重载__new__方法,我们实现了需要的功能。 __init__ __init__是实例方法。...class调用__init__时,是对这个class生成的新实例初始化,初始化的内容,就是__init__内定义的内容。

    73050

    详解Python中的__init__和__new__的区别

    二、__new__ 方法是什么? __new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法。 ?...首先执行使用name和age参数来执行Person类的__new__方法,这个__new__方法会 返回Person类的一个实例(通常情况下是使用 super(Persion, cls)....然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是 __init__里面的的 self 所以,__init__ 和 __new__ 最主要的区别在于: 1....其实我最早接触__new__的时候,就是因为需要自定义 metaclass,但鉴于篇幅原因,我们下次再来讲python中的metaclass和__new__的关系。...四、用__new__来实现单例 事实上,当我们理解了__new__方法后,我们还可以利用它来做一些其他有趣的事情,比如实现 设计模式中的 单例模式(singleton) 。

    1.8K10

    说说Python中的__new__和__init__的区别?

    废话不多说,开始今天的题目: 问:说说Python中的__new__和__init__的区别? 答:在Python中__new__和__init__具有不同的功能。...以object为基类可以使得所定义的类具有新类所对应的方法(methods)和属性(properties)。 在下面的文章中我们会分别基于新类和旧类探讨__new__和__init__。...Python旧类中的__new__和__init__ Python的旧类中实际上并没有__new__方法。因为旧类中的__init__实际上起构造器的作用。...Python新类中的__new__和__init__ Python的新类允许用户重载__new__和__init__方法,且这两个方法具有不同的作用。__new__作为构造器,起创建一个类实例的作用。...0x109290890> 创建类实例并初始化的过程中__new__和__init__被调用的顺序也能从上面代码的输出结果中看出

    73030

    【Python之理解__new__和__init__的区别】

    前言: 在 Python 的丰富工具箱中,_new 和 init 是两个看似相似却又截然不同的概念。...从表面上看,它们都与对象的构建有关,但它们的职责和执行时机却有着根本性的不同。在本文中,我们将深入剖析 new 和 init,揭示它们各自的独特之处,带你走进 Python 对象创建的内部机制。...很多同学都以为Python中的__init__是构造方法,但其实不然,Python中真正的构造方法是__new__。__init__和__new__有什么区别?本文就来探讨一下。...继承与 new 和 init: 在面向对象编程中,继承是一个强大的机制,而 new 和 init 方法在继承中起着至关重要的作用。当子类继承父类时,这两个方法是如何被继承和重写的呢?...结尾: 通过本文的学习,我们深入了解了 Python 中 new 和 init 的差异,了解了它们在对象创建和初始化过程中的独特作用。new 负责对象的创建,而 init 负责对象的初始化。

    35510

    __init__和__new__的对比及单例模式

    简单总结如下: 1,__new__方法是对象的生成方法,__init__方法是对象的初始化方法。 2,对象生成后,才能初始化。故__new__方法在__init__方法之前调用。...3,__new__方法的第一个参数是cls,指的是类本身,__init__的第一个参数是self,指的是__new__方法生成的对象。...4,__new__方法的其余参数会和生成的对象一起继续传给__init__方法。 5,__new__方法的返回值通常调用其父类的__new__方法生成。 6,__init__方法不能有返回值。...7,__new__较少使用,可以用它实现单例模式,即一个类只能创建一个实例,有时候通过使用单例模式可以极大减少内存的占用。...视频中用到的代码如下: class Book(object): #对象生成方法 def __new__(cls, title): # 设计成单例模式 if

    33220

    Python自学成才之路 元类中的__new__和__init__方法

    元类其实和普通类一样,普通类的__new__方法是创建实例,__init__方法是初始化实例,说是初始化,其实就是可以给实例添加一些属性。...在元类中也是一样,只是元类__new__创建的是类实例,__init__是对类实例做修改。...元类__init__中的第一个参数是cls(普通类是self)表示的是类实例本身,有了类实例本身,当然能对类做一些修改。那么在__new__和__init__方法中都可以对类实例做什么样的修改?...建议:在看本节之前建议先debug下一节的最后一个案例(传送门) 元类中,__new__和__init__中除了第一个参数不一样,其它参数都是一样的,参数都是类名,基类,类属性字典。...这是元类创建一个类的三要素。在下面这个案例中,我将分别在__new__和__init__方法中做一些手术。

    64830

    Objective-C中的继承和多态

    在Objective-C中super是指向直接父类的指针,而self是指向本身的指针,self就相当于java中的this指针。...+(id) alloc:  返回一个已经分配好的内存对象;  -(id) init: 对已经分配了内存的实例进行初始化; new同时调用了alloc 和 init         demo:   Object... *object = [[Object alloc] init];         可以在子类中把alloc进行重写,然后观察运行情况 1 2 3 4 5 6 //重写alloc方法 +(id) alloc...(@"init被调用了");     self = [super init];     return self; }         测试方法一个用alloc和init实例化类,一个用new实例化类:...= nil;  //实例化猫的对象 animal = [Cat new]; [animal eat];  //实例化狗的对象 animal = [Dog new]; [animal eat]; 面向对象编程中的

    1.2K80

    类和对象的创建过程(元类,__new__,__init__,__call__)

    __new__方法在类定义中不是必须写的,如果没定义,默认会调用object.__new__去创建一个对象。如果定义了,就是会覆盖,使用自定义的,这样就可以自定制创建对象的行为。  ...如果Python没有找到metaclass,它会继续在Bar(父类)中寻找metaclass属性,并尝试做和前面同样的操作。...元类的__new__和__init__影响的是创建类对象的行为,父元类的__call__控制对子元类的 __new__,__init__的调用,就是说控制类对象的创建和初始化。...父元类的__new__和__init__由更上层的控制,     一般来说,原始type是最初的父元类,其__new__和__init__是具有普遍意义的,即应该是分配内存、初始化相关信息等 元类_..._call__影响的是创建类的实例对象的行为,此时如果类自定义了__new__和__init__就可以控制类的对象实例的创建和初始化 __new__和__init__ 影响的是创建对象的行为,当这些函数在元类中时

    1.2K50

    Golang中make和new的区别

    new: func new(Type) *Type 接收一个参数,这个参数是一种类型,而不是一个值,分配好内存后,返回一个指向该类型内存地址的指针,这个指针指向的内容的值为该类型的零值。...对于不同的数据类型,零值的意义是完全不一样的。...比如,对于bool类型,零值为false;int的零值为0;string的零值是空字符串 make: func make(t Type, size ...IntegerType) Type 同样用于内存分配...,但和new不同,make用于channel,slice和map的分配,而且返回的类型就是这三个类型本身,而不是它们的指针,因为这三种类型本身就是引用类型,所以就没必要返回他们的指针了。...具体而言,有如下几种用法: (1)make(map[string]string):即缺少长度的参数,只传类型,这种用法只能用在类型为map或chan的场景 (2)make([]int, 2):指定了长度

    73730

    golang中make 和 new 的区别

    golang中make 和 new 的区别 介绍 new new 是一个内建函数,用于分配一块内存并返回指向该内存的指针。 它会为该类型的零值分配内存,并返回指向该类型的指针。...make 只能用于切片、映射和通道的创建,不适用于其他类型。...make 仅适用于切片、映射和通道的创建,返回的是对应引用类型的实例。 返回类型: new 返回的是指向类型的指针。 make 返回的是对应引用类型的实例,而不是指针。...初始化: new 分配的内存会被清零,返回的是该类型的零值的指针。 make 返回的是被初始化过的引用类型的实例,如切片、映射和通道等。...代码示例 下面是用 Go 语言演示 make 和 new 的区别的代码: package main import ( "fmt" ) func main() { // 使用 new

    5200

    Go中make和new的区别

    在 Go 语言中,make和new都用于分配内存,但它们有以下区别:一、功能不同 make用于初始化切片(slice)、映射(map)和通道(channel)这三种特定的数据结构,并返回一个初始化后的对象...它可以用于任何类型,但主要用于值类型(如结构体)和基本数据类型的内存分配。 二、返回值类型不同 make返回的是初始化后的特定数据结构本身,而不是指针。...例如,make([]int, 5)返回一个长度为 5 的切片,而不是指向切片的指针。 new返回的是指向新分配类型零值的指针。例如,new(int)返回一个指向整数类型零值的指针。...三、适用场景不同 make适用于切片、映射和通道的初始化,因为这些数据结构需要特定的内部初始化操作才能正常使用。...四、初始化程度不同 make会对特定的数据结构进行完整的初始化,包括设置长度、容量(对于切片和通道)、内部的哈希表(对于映射)等,使其可以立即使用。

    8100

    git init 和 git init –bare 的区别

    使用命令"git init --bare"(bare汉语意思是:裸,裸的)初始化的版本库(暂且称为bare repository)只会生成一类文件:用于记录版本库历史记录的.git目录下面的文件;而不会包含实际项目源文件的拷贝....git目录,而是只生成.git目录下面的版本历史记录文件,这些版本历史记录文件也不再存放在.git目录下面,而是直接存放在版本库的根目录下面 1.不使用--bare git init joshuatest.git...2.使用--bare git init --bare joshuatest2.git ? 用"git init"初始化的版本库用户也可以在该目录下执行所有git方面的操作。...但别的用户在将更新push上来的时候容易出现冲突。 比如有用户在该目录(就称为远端仓库)下执行git操作,且有两个分支(master 和 test),当前在master分支下。...但如果是往远端仓库中空闲的分支上提交还是可以的,比如 git push origin master:test   还是可以成功的 解决办法就是使用”git init –bare”方法创建一个所谓的裸仓库

    2.3K80

    Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系1.单继承时super()和__init__()实现的功能是类似的class Base(object): def __init__(self...__init__(), super(childA, self)返回当前类的继承顺序中childA后的一个类childB;然后再执行childB().__init()__,这样顺序执行下去。  ...在多重继承里,如果把childA()中的 super(childA, self).__init__() 换成Base....,如果是本身就会依次继承下一个类;如果是继承链里之前的类便会无限递归下去;如果是继承链里之后的类便会忽略继承链汇总本身和传入类之间的类;比如将childA()中的super改为:super(childC...childA基础Base, childB继承childA和Base,如果childB需要调用Base的__init__()方法时,就会导致__init__()被执行两次:class Base(object

    72710
    领券