OC 中new与alloc/init的区别

news/2025/2/23 5:47:27

OC 中newoc>alloc/init的区别

英文详解:http://macresearch.org/difference-between-oc>alloc-init-and-new

1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className oc>alloc] init]

但是并不意味着你不会接触到new,在一些代码中还是会看到[className new],

还有去面试的时候,有时候会被问到这个问题。

2.那么,他们两者之间到底有什么区别呢

我们看源码:

  
    initial; word-wrap:break-word; word-break:normal; border:none; background-color:rgb(247,247,247); margin:0px 0px 1px 3em!important">
  1. new 
  2. id newObject = (*_oc>alloc)((Class)self, 0); 
  3. Class metaClass = self->isa; 
  4. if (class_getVersion(metaClass) > 1) 
  5. return [newObject init]; 
  6. else 
  7. return newObject; 
  8.  
  9. //而 oc>alloc/init 像这样: 
  10. oc>alloc 
  11. return (*_zoneAlloc)((Class)self, 0, moc>alloc_default_zone());  
  12. init 
  13. return self; 

通过源码中我们发现,[className new]基本等同于[[className oc>alloc] init];

区别只在于oc>alloc分配内存的时候使用了zone.

这个zone是个什么东东呢?

它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度;

3.而为什么不推荐使用new

不知大家发现了没有:如果使用new的话,初始化方法被固定死只能调用init.

而你想调用initXXX怎么办?没门儿!据说最初的设计是完全借鉴Smalltalk语法来的。

传说那个时候已经有oc>allocFromZone:这个方法,

但是这个方法需要传个参数id myCompanion = [[TheClass oc>allocFromZone:[self zone]] init];

这个方法像下面这样:

  
    initial; word-wrap:break-word; word-break:normal; border:none; background-color:rgb(247,247,247); margin:0px 0px 1px 3em!important">
  1. oc>allocFromZone:(void *) z 
  2. return (*_zoneAlloc)((Class)self, 0, z);  
  3.  
  4. //后来简化为下面这个: 
  5. oc>alloc 
  6. return (*_zoneAlloc)((Class)self, 0, moc>alloc_default_zone());  

但是,出现个问题:这个方法只是给对象分配了内存,并没有初始化实例变量。

是不是又回到new那样的处理方式:在方法内部隐式调用init方法呢?

后来发现“显示调用总比隐式调用要好”,所以后来就把两个方法分开了。

概括来说,newoc>alloc/init在功能上几乎是一致的,分配内存并完成初始化。

差别在于,采用new的方式只能采用默认的init方法完成初始化,

采用oc>alloc的方式可以用其他定制的初始化方法。

原文:http://blog.csdn.net/aaidong/article/details/46998799



http://www.niftyadmin.cn/n/652415.html

相关文章

Java实现多个客户端聊天程序

复习了一天Java。晚上写了一个HeartChat 0.1,实现多个客户端相互聊天的机制。代码如下: Java代码 import java.awt.*; import java.awt.event.*; import java.io.*; import java.lang.*; import java.net.*; public class HeartClient ex…

IOS-TextField控件详解

//初始化textfield并设置位置及大小 UITextField *text [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone…

【javaWeb】Struts 2导出excel文件

一、功能&#xff1a;将界面table数据&#xff0c;导出为excel文件保存 二、具体实现&#xff1a; 2.1 jsp 序号书名作者价格 1科幻世界匿名102语文驾教育出版社23.53落花张三10.5注&#xff1a;button: <input type"button" value"导出excel" οnclick…

iOS 启动图片,之后的广告图片效果

iOS 应用添加开屏广告 在AppDelegate.h中的代码 #import <UIKit/UIKit.h>interface AppDelegate : UIResponder <UIApplicationDelegate>property (strong, nonatomic) UIWindow *window; property (strong, nonatomic) UIImageView *adImageView; property (stro…

UIView 中常见的方法总结

UIView 中常见的方法总结 addSubview: 添加一个子视图到接收者并让它在最上面显示出来。 - (void)addSubview:(UIView *)view 讨论 这方法同样设置了接收者为下一个视图响应对象。接收者保留视图。如果你使用removeFromSuperview方法用来把视图移除他的显示列表&#xff0c…

如何手工删除AD RMS SCP?

目前微软的最新的windows server 2012已经推出&#xff0c;在windows server 2012的域环境安装IRM时&#xff0c;我们发现SCP不能注册 成 功&#xff0c;原因就是之前windows server 2008的域环境下的AD RMS SCP没有清理掉。 在此环境中&#xff0c;需要手工删除AD RMS SCP。以…

iOS MKMapView 基础知识

property(nonatomic) MKMapType mapType //要显示地图的类型enum {MKMapTypeStandard, //标准地图&#xff0c;显示所有道路和路名MKMapTypeSatellite, //显示卫星视图。MKMapTypeHybrid //混合显示&#xff0c;将卫星视图展示在标准地图上};typedef NSUInteger MKMapType;prop…

使用组策略向域中计算机的组添加或删除成员

配置受限制的组 使用组策略中“受限制的组”可以控制组的成员或组所属的组。这样可以集中控制域中计算机或服务器的特定组的成员和特定组的所属的组。以下示例将会说明受限组的作用。 示例&#xff1a;配置受限制的组 李文斌域用户需要使用远程桌面管理公司服务器&#xff0c;为…