【Objective-C 篇】 ☞ 2. 性能、方法

1. 特性(Property)和实例变量(instance variable)

1.1 当定义一个性质时,本质上是在干什么(编译器在帮我们干什么):

1) 生成实例变量用来保存属性的值

2) 生成访问器(setter和getter方法)用于修改和访问属性的值

1.2 实际开发中明白的事:

1) 只读属性:只可以读取值,不可以修改值。这种属性只生成getter方法,不生成setter方法。

2) 总计属性:没有对号入座的实例变量,属性的值平时是由此测算得到的。在swift中,这种性质叫统计属性。

3) 自定义setter/getter:一个性能的getter方法和setter方法都得以由程序员自定义。当程序员不乐意编译器生成的拜访方法(setter/getter)时,可以自定义。

a.倘诺只自定义了setter方法,编译器补上getter方法和实例变量

b.如果只自定义了getter方法,编译器补上setter方法和实例变量

c.假使自定义了getter和setter,编译器就会以为你不需要实例变量,不会补上实例变量

1.3 属性的其他细节

1) 如若getter和setter都自定义了,实例变量就不会自动生成,但一旦需要实例变量,能够接纳性能合成器synthesize指定实例变量:

在implementation中,加一句: @synthesize 属性名 = 实例变量名;

//使用属性合成器指定属性所对应的实例变量

@synthesize age = _age;//此时编译器会生成_age这个实例变量

2) 假诺getter方法和setter方法不需要编译器生成,可以在.m文件中动用 @dynamic 来要求编译器不要转移访问方法。

使用场景:一般会在CoreData的代码应用这种办法。

@dynamic 属性名; //不要生成此属性的setter和getter

特种属性,编译器不生成setter和getter,程序在运作时才通过独特手段取得setter和getter方法。

时不时会在CoreData的代码中看看这种意况。(如:属性的值需要取得后台数据库读到) 

3) 实例变量的拜会范围

  • 在接口部分(.h文件中)定义的实例变量默认(@protect)可以在本类的其中,及子类的其中访问。
  • 在.m文件中定义的实例变量,只好在本类的内部访问。其实地方都访问不了。都是私房的。
  • 在接口部分(.h文件中)定义的实例变量假如真希望旁人也走访,可以用@public将其精晓。大家不提出这样做。

//实例变量的访问修饰符

{

@protected //默认是保护,可省略不写

    int protectedVar;//默认是保护的,只能在本类内部及子类内部访问

@public

    int publicVar;//公开的实例变量,一般不这样做

@private

    int privateVar;//私有的实例变量,只能在本类的的内部访问

}

2. 开头化方法(构造方法)

2.1 概念

一种奇特的主意,专门用来起初化对象。

在OC中init伊始的章程,我们称为开始化方法(构造方法)。

     构造方法的用处:用于初步化一个目的,让某个对象一成立出来就持有某些性能和值

[[类型 alloc]init]; //init就是开端化方法

 

2.2 怎么写

任何一个目的,都默认有一个初阶化方法:init,是从NSObject类中继续来的。

假设程序员不称心继承来的init方法,可以自己重写。

C语言,怎么写?固定写法:

1) 必须先调用父类的起初化方法,并将再次来到值赋值给self(self是指向当前目的的引用)

2) 假使父类最先方法调用成功,此时给目的中的属性赋开头值。先导化对象的重要目标就是给属性赋值。

3) 方法结束时,必须重临当前目的(self).

在意: 开头化方法重回空代表伊始化败北

    C语言 1

2.3 开始化方法的注意事项

1) 起始化方法可以有两个,开头化对象时方可采用的调用。

2) 当一个类没有提供其他开始化方法时,也有init方法。从父类继承来的init方法会将装有的特性先导化为0.

3) 关于空(nil),在OC中表示空指针的字面值是nil,相当于C语言中的NULL

    C语言 2

4) 重返值类型instancetype(instancetype会自动把重返值类型变成现实的序列)

  • 从iOS7 SDK起先,
    初始化方法,以及创设对象的厂子方法,其重临值全部运用instancetype类型。
  • instancetype会自动按照章程的回到对象识别再次回到类型(再次回到什么类型的对象instancetype就改成什么样项目,instancetype会自动知道再次来到值的品类),instancetype只好出现在重返值类型上。

2.4 id类型

id类型是动态类型,当程序运行到这句话时,才知晓这句话某一个变量是如何类型。

id类型定义的变量,它里面存的这些值的连串不确定。运行时才规定,编译时也不确定。也叫万能指针。

  • id类型是万能类型,有风险;id类型只针对对象类型,不对准主题项目;id类型只可以针对对象。是一种通用对象类型!
  • id类型的变量其实是一个得以本着任何类型对象的引用(指针),类似于C语言中的void*(万能指针)

如:id r = [[TRPerson
alloc]init];

id类型被定义为指向NSObject子类的实例对象的指针

double d = 10.5;

id a = &d;//ERROR

id是一个指南针,但在接纳时无需加*

id stu = nil;

id类型的变量可以出现在变量能出现的另外地点,比如方法的参数上,重返值类型上,或直接定义局部变量等。

利用id类型的裨益:可以针对任何对象; 坏处:编译器失去了对品种的检讨。

 

总结:id和instancetype的区别

  1. id可以做方法的归来值类型,方法的参数类型,还足以一贯讲明变量,或概念成属性
  2. instancetype只好做起先化方法和工厂方法的回来值类型,不可能在艺术的参数等地点接纳instancetype

instancetype类型比id类型好一些:因为instancetype会自动把它的归来值类型转换成它现实的连串。而id类型则是万能类型,带有一定的高风险(还要做一些类型转换,多了部分步骤,性能和频率会低一些)。

3. 类方法(class method)

3.1 概念

1) 实例方法(instance method):

以”-“号起始的形式叫实例方法

务必通过实例(对象)去调用,向目标发音信会调用实例方法

2) 类方法

以”+”号起先的法门叫类方法

非得通过类去调用,向类发信息就会调用类方法

倘若一个措施的实际贯彻与对象无关(即不会利用对象的特性或实例变量),就足以考虑写成类措施!!!

注意:

类措施中不可以运用类的成员变量!(即在类模式中不可能平昔访问对象的事物)

在实例方法中可以利用类的成员变量!

 

3.2 为何使用类措施

1) 类方法的调用相比较便宜,不用创建对象就足以

2) 假诺有一个办法,不需要接纳某个对象属性,那么可以设想写成类模式,为了有利于调用。

3) 平日应用类措施来成立对象,这连串措施被称作简单工厂方法,或直接叫工厂方法

在类形式中,不可能直接访问属性和实例变量,也不可以从来调用实例方法。(与对象有关的操作在类措施中都不可能用!)

类措施属于所有类,和求实的对象无关,所以目标的习性和实例变量不可能在类形式中做客。

    

  1. 工厂方法(Factory Method)

一个类为了方便创立对象,提供一个类措施重返一个新对象,那多少个类形式就叫工厂方法。是简简单单工厂格局的求实展现。

工厂方法就是把alloc方法和init…方法统一写成一个措施。

厂子方法的形式名格式:类名WithXXX…起始(类名首字母小写)

TRPoint *p1 = [[TRPoint alloc]initWithX:1 andY:2];//一般创立对象

TRPoint *p2 = [TRPoint pointWithX:2 andY:4];//用工厂方法成立对象

   C语言 3

  1. 单例情势(Singleton):就是单个实例的意思。是一种独特的厂子方法。一个类只允许成立一个对象。

何以是单例形式:

1)首要用来做应用程序的资源共享控制

2)只可以生成唯一的对象

3)利用类格局来创设和做客对象

单例形式的规律:

1)类中定义一个实例(static全局变量)

2)类中定义一个类格局作为单例方法

3)在单例方法中一旦类中定义的实例为空,则创制该类的实例;否则重回此实例。

     C语言 4

     C语言 5

单例格局的功利:节约资源、提高效用、统一保管。

NSNotificationCenter
通知中心也是一个单例类

UIApplication(代表一个应用程序,App是唯一的)
就是一个单例类

   C语言 6

C语言 7

设计格局:(经典23种设计格局)

缓解一个超人问题的最佳方案。

厂子格局:
简单工厂形式(工厂方法)   工厂格局  抽象工厂

 

简写情势:[TRPoint new];约等于写[[TRPoint alloc]init]; (一个意味的两样写法)

[[TRPoint alloc]init]这种写法方便重写起初化方法(init..),[TRPoint new]这种写法无法。