在object-c基础教程这本书里老是可以看见类似下面这种代码,我这小菜鸟就纳闷了,啥区别啊,看上去都一样么。网上找了找,找到一些说法,这里先摘出来。
someClass* object = [someClass new];
or
someClass* object = [[someClass alloc] init];
其实是一样的,某位老兄是这样说的,new在内部调用的alloc和init,
Actually "new" is not a keyword in Objective-C, but NSObject implements a class method "new" which simply calls "alloc" and "init".
既然一样干嘛有两个,吃饱了那个啥来着。。
The new method actually comes from NeXT days. Back then, there was no two phase initialization, it was just a single new method. They soon realized that a two phase approach could have advantages, and introduced alloc. new was kinda deprecated, but kept in for backwards compatibility. It is exactly the same as alloc-init. Use 'new' if it suits. One shortcoming is that it only works with the basic 'init' initializer, and will not work with other initializers (eg initWithString:).
背景说明,new是较为老式的写法,后来发现只有一个new不好使,才引入了alloc和init这种写法,保留new一是向后兼容,二是很多时候是一种更简单的写法。至于alloc这种写法可以变出这样的花来,
Frequently, you are going to need to pass arguments to init and so you will be using a different method, such as [[SomeObject alloc] initWithString: @"Foo"]. If you're used to writing this, you get in the habit of doing it this way and so [[SomeObject alloc] init] may come more naturally that [SomeObject new].
恩,确实如果不需要用其他的init函数,比如initWithString, 用new的方法,毫无疑问是更加方便的。
再来个据说是来源比较靠谱的说法:
There was a very long thread on this same subject (alloc/init vs. new) on the cocoa-dev mailing list this week (search for "[Foo new] vs [[Foo alloc] init]"). Unfortunately the documentation is not crystal clear on this, but Bill Bumgarner (an Apple Engineer) confirmed that new is implemented as allocWithZone/alloc followed by init back at least to the beginning of OS X. So the answer is, use whichever you prefer. The current vogue in Cocoa programming is to use alloc/init because it makes the intended behavior explicit.
好吧,似乎只有显示调用更加容易理解这一个区别了,总之一句话,爱谁谁。
这位兄弟来了个总结性发言,姑且咱先信了他,
* new doesn't support custom initializers (like initWithString)
* alloc-init is more explicit than new
General opinion seems to be that you should use whatever you're comfortable with.
以上的说法都来自http://macresearch.org/difference-between-alloc-init-and-new , 有兴趣的看看把。
分享到:
相关推荐
MyClass *objectName = [[MyClass alloc] init]; ``` - **方法调用**: ```objective-c [objectName someMethod:argument1 anotherArgument:argument2]; ``` 其中`someMethod:anotherArgument:`这样的写法...
**Object-C 学习笔记** Objective-C(简称Obj-C或Objective C)是苹果公司基于C语言开发的一种面向对象编程语言,主要用于iOS和macOS平台的应用程序开发。它在C语言的基础上添加了Smalltalk风格的消息传递机制,...
这篇学习笔记主要涉及了Objective-C的基础知识,包括对象创建、类的结构、文件导入、实例变量、接口与实现、内存管理和属性。 1. **对象创建**: - `string`方法创建的字符串对象是自动释放的,意味着系统会在适当...
MyClass *myObject = [[MyClass alloc] init]; myObject.name = @"John"; myObject.age = 30; [myObject printName]; [myObject printAge]; ``` - `[MyClass alloc]`: 分配内存空间。 - `[init]`: 初始化对象。 - `...
- 通过`[[类名 alloc] init]`创建对象实例。 - **方法调用**: 采用消息发送的方式进行方法调用,如`[对象 方法名]`。 #### 五、详细说明 - **多重参数**: 支持在一个方法中传递多个参数。 - **建构子...
- 在Object-c中,通过`alloc`或`new`关键字创建类的实例。例如,`Class-Name *test = [Class-name alloc];` 创建了一个名为`test`的指针,指向`Class-name`类的新实例。非对象类型变量(如int, float等)无需加`*`...
对象是类的实例,可以通过使用`alloc`和`init`方法来创建。 描述中提到的“Object-C 进阶书籍---面向对象”暗示着文档的内容可能是关于如何深入理解和应用Objective-C进行面向对象的编程。这可能包括高级主题,比如...
《Object-Oriented Programming with Object C》是一本深入探讨面向对象编程(OOP)与Objective-C语言的专业书籍。Objective-C是Apple开发的一种强大的、面向对象的编程语言,主要用于iOS和macOS的应用程序开发。这...
- **函数: init_bootmem_node** 针对多节点系统的初始化函数,每个节点都可以有自己的内存映射。 - **函数: init_bootmem_core** 实现了初始化内存分配器核心逻辑的函数。 ##### 1.3 分配内存 (Allocating ...
4. **C语言兼容**:与 C 语言高度兼容,可直接使用 C 语言代码。 5. **Foundation框架**:与苹果提供的 Foundation 框架集成,提供了一系列高级 API,如文件处理、网络通信等。 6. **Cocoa 和 Cocoa Touch 框架**:...
- 对象的创建通常使用`alloc`和`init`方法,如`MyClass *myObject = [[MyClass alloc] init];`。 3. **方法**: - 实例方法:作用于对象实例。 - 类方法:作用于类本身,通常用于创建对象实例或执行与类相关的...
### Object-C语言入门教程知识点详解 #### 一、基础语法 **1.1 变量与数据类型** 在Object-C中,你可以定义不同类型的变量,包括但不限于整型(`int`)、浮点型(`float`、`double`)、字符型(`char`)和字符串...
Object-C(Objective-C)是苹果公司基于C语言开发的一种面向对象的编程语言,主要用于iOS和macOS平台的应用程序开发。它在C语言的基础上添加了Smalltalk风格的消息传递机制,使得面向对象编程更加灵活。本教程将帮助...
在Objective-C中,通常使用`alloc`和`init`方法来实例化对象。 - **方法调用**:Objective-C采用了Smalltalk风格的消息传递模型。这意味着对象之间的交互是通过消息传递而非传统的函数调用来实现的。 **2. 面向对象...
通过这个基于Object-C的健身俱乐部会员系统项目,开发者可以深入学习Objective-C语言的核心概念,并掌握iOS应用开发的基本流程和技术。从界面设计到数据管理,再到网络通信和用户体验优化,这个项目涵盖了移动应用...
Objective-C,简称Object-C,是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,添加了Smalltalk风格的消息传递机制。本笔记主要关注的是Object-C中的自定义类的定义与调用,这是理解面向对象编程的关键...
在iOS开发中,Object-C是苹果官方推荐的编程语言,用于构建iPhone、iPad等设备上的应用程序。本主题将深入探讨如何使用Object-C解析并显示Microsoft PowerPoint(MS PPT)文件,为开发者提供一种在iOS应用中集成PPT...
Objective-C是一种功能强大且灵活的面向对象编程语言,它在C语言基础上增加了面向对象的特性。自1980年代由Brad Cox和Tom Love设计以来,Objective-C经过苹果公司的采纳与改进,成为了macOS和iOS开发中的关键语言之...
Objective-C(Object-c)是Apple公司为Mac OS X和iOS操作系统开发的一种面向对象的编程语言,它是C语言的超集,融入了Smalltalk的关键特性。本教程旨在为初学者提供一个全面的Objective-C入门指导,涵盖了从基本语法...
Person *person = [[Person alloc] init]; [person setName:@"John Doe" andAge:30]; [person printInfo]; } return 0; } ``` #### 三、Objective-C进阶概念 ##### 2.1 属性和合成 Objective-C提供了`@...