load&initialize&单例模式

1、load方法:

1> 当类被引用进程序的时候会执行这个函数

2> 一个类的load方法不用写明[super load],父类就会收到调用,并且在子类之前。

3> Category的load也会收到调用,但顺序上在主类的load调用之后。

2、initialize方法:

1> initialize的自然调用是在第一次主动使用当前类的时候

2> 和load不同,即使子类不实现initialize方法,会把父类的实现继承过来调用一遍。注意的是在此之前,父类的方法已经被执行过一次了,同样不需要super调用。

3、load和initialize有很多共同特点,下面简单列一下:

1> 在不考虑开发者主动使用的情况下,系统最多会调用一次

2> 如果父类和子类都被调用,父类的调用一定在子类之前

3> 都是为了应用运行提前创建合适的运行环境

4> 在使用时都不要过重地依赖于这两个方法,除非真正必要

由于initialize的这些特点,使得其应用比load要略微广泛一些。可用来做一些初始化工作,或者单例模式的一种实现方案

初始化很简单在这里就不举例了,那么单例模式的实现在initialize里是怎么完成的呢?

static UserHelper * helper = nil;

+ (void)initialize {

if ([self class] == [UserHelper class]) {

helper = [[UserHelper alloc] init];

}

}

试想一下,这样是不是很简单的就实现单例模式呀

那么我们顺便来说一下单例模式吧,我的理解就是,一个类里只有一个实例对象,看一下比较官方的概念

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

单例的创建步骤

(1)创建类方法,返回对象实例.以shared  default current开头。

(2)创建一个全局变量用来保存对象的引用

(3)判断对象是否存在,若不存在,创建对象

单例的几种实现方法

1> 非线程安全写法

static UserHelper * helper = nil;

+ (UserHelper *)sharedUserHelper {

if (helper == nil) {//判断对象是否存在,若不存在,创建对象

helper = [[UserHelper alloc] init];

}

return helper;

}

2> 线程安全写法1

static UserHelper * helper = nil;

+ (UserHelper *)sharedUserHelper {

@synchronized(self) {//加一个互斥锁,这样就不会再同时访问该方法的时候,创建两个实例,导致实现单例错误了,对上一种方法的完善

if (helper == nil) {

helper = [[UserHelper alloc] init];

}

}

return helper;

}

3>线程安全写法(苹果推荐,主要用这个,我们也最长用这个)

static UserHelper * helper = nil;

+ (UserHelper *)sharedUserHelper {

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

helper = [[UserHelper alloc] init];

});

return helper;

}

还有一种就是上面介绍的那种,创建单例的方法很多种哦~~你记住了几种呢?

时间: 2024-10-09 08:33:30

load&initialize&单例模式的相关文章

load & initialize

  +(void)load +(void)initialize 执行时机 在程序运行后立即执行 在类的方法第一次被调时执行 若自身未定义,是否沿用父类的方法? 否 是 类别中的定义 全都执行,但后于类中的方法 覆盖类中的方法,只执行一个 load & initialize方法不需要调用父类的方法. Runtime调用load的时候还没有生成autorelease pool.

WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version

[[email protected] /root]#hadoop checknative -a 18/12/09 00:31:19 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version 18/12/09 00:31:19 INFO zlib.ZlibFactory: Successfully loaded & initial

iOS培训笔记--load,initialize方法

+(void)load:在程序启动时就会调用一次该方法特点:先调用父类,再调用子类,再调用分类(编译的时候加载顺序:父类->子类->分类),分类中的load不会覆盖主类中的load +(void)initialize:在类被头一次使用时会调用该方法特点:先调用父类中的initialize,再调用子类中的initialize

+load 和 +initialize

APP 启动到执行 main 函数之前,程序就执行了很多代码. 执行顺序: 将程序依赖的动态链接库加载到内存 加载可执行文件中的所有符号,代码 runtime 解析被编译的符号代码 遍历所有的 class 按继承层级一次调用 Class 的 load 和 category 的 load 方法. +(void)initialize 与 +(void)load 两个方法的比较 +load +initialize 调用时机 被添加 runtime 时 收到第一条消息时,也可能永远不调用 调用顺序 父类

Google maps api demo

demo: <!DOCTYPE html> <html> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> <meta charset="utf-8"> <title>KML Layers</title> <style> html, body, #ma

bootstrap 02

<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <link type="text/css" rel="stylesheet" href="bootstrap3/css/bootstrap.css"> &l

Google地图接口API之地图事件(四)

演示几个地图事件: 1. 点击标记缩放地图 仍然使用上一遍文章使用的英国伦敦的地图.点用户点击标记时实现缩放地图的功能(点击标记时绑定地图缩放事件). 代码如下: <html> <head> <script src="http://maps.googleapis.com/maps/api/js?key=AIzaSyDY0kkJiTPVd2U7aTOAwhc9ySH6oHxOIYM&sensor=false"> </script>

Google地图接口API之地图基础

拥有一个免费的API Key之后就可以正式调用Google的API了进行开发了. 创建一个简单的 Google 地图: <html> <head> <script src="http://maps.googleapis.com/maps/api/js?key=AIzaSyDY0kkJiTPVd2U7aTOAwhc9ySH6oHxOIYM&sensor=false"> </script> <script> functio

在Google Map中显示多个Marker并画出Polygon

有时需要在地图显示多个位置并画出多段线 实现后截图: HTML: <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>Google Maps Multiple Markers</title> <script src="h