首页
学习
活动
专区
工具
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并不会调用。

73740

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__内定义内容。

65150

详解Python__init____new__区别

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

1.6K10

说说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__被调用顺序也能从上面代码输出结果中看出

65030

【Python之理解__new____init__区别】

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

16110

__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

30420

Python自学成才之路 元类__new____init__方法

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

58230

Objective-C继承多态

Objective-Csuper是指向直接父类指针,而self是指向本身指针,self就相当于javathis指针。...+(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; }         测试方法一个用allocinit实例化类,一个用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.1K50

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”方法创建一个所谓裸仓库

2K80

Golangmakenew区别

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

71530

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继承childABase,如果childB需要调用Base__init__()方法时,就会导致__init__()被执行两次:class Base(object

67610

JavanewInstance()new()区别

两者创建对象方式不同,前者是实用类加载机制,后者则是直接创建一个类: newInstance创建类是这个类必须已经加载过且已经连接(Class.forName(“A”)这个过程),new创建类是则不需要这个类加载过...newInstance 是弱类型(GC是回收对象限制条件很低,容易被回收)、低效率、只能调用无参构造,new是强类型(GC不会自动回收,只有所有的指向对象引用被移除是才会被回收,若对象生命周期已经结束...= (AInterface)c.newInstance(); //进一步,如果写成下面这样,更好理解: String className = readfromXMlConfig;//从xml 配置文件获得字符串...newInstance实际上是把new这个方式分解为两步,即,首先调用class加载方法加载某个类,然后实例化。 这样分步好处是显而易见。...我们可以在调用class静态加载方法forName时获得更好灵活性,提供给了我们降耦手段。 ----

43210

Objective-C深拷贝浅拷贝

Objective-C对象之间拷贝分为浅拷贝深拷贝。说白了,对非容器类浅拷贝就是拷贝对象地址,对象里面存内容仍然是一份,没有新内存被分配。...对容器类深拷贝是对容器每个元素都进行拷贝,容器类浅拷贝是对容器里内容不进行拷贝,两个容器地址是不同,但容器里所装东西是一样,在一个容器修改值,则另一个浅拷贝容器值也会变化。...下面会通过对不同类型对象进行测试来详细理解一下对象深拷贝浅拷贝。         那么对象大体都分为哪些类型呢?从可变不可变容器类非容器类角度可以把对象分为一下几种,那么什么是容器类呢?...,copymutableCopy对于容器本身是深拷贝,原因是返回了一个新容器地址,但对于容器元素仍然是浅拷贝。             ...自定义类对象之间深浅拷贝问题 在Objective-C并不是所有的类都支持拷贝;只有遵循NSCopying协议类,才支持copy拷贝,只有遵循NSMutableCopying协议类,才支持mutableCopy

1K90
领券