【Objective-C 篇】 ☞ 3. self、数据类型、编码规范

1. self关键字 

self 是3个指针,哪个目的调用方法就指哪个目的,其作用是分别不一样目的。

1.1 在实例方法中的self,代表当前目标

现阶段目标,通过哪些目标调用了这些点子,方法中的self就对准十分目的。那些目标就叫当前对象.

1.2 在类措施中的self,代表当前类

类格局中,self代表类措施所在的类自个儿。所以在类格局中,self会被一贯当类来行使

大家引进在类形式运用self代替类,因为便宜子类继承

总结:

一旦self在目标方法中,那么self就代表调用当前目的方法的老大目的

若是self在类措施中,那么self就意味着调用当前类情势的万分类

咱俩只用关爱self在哪多个方法中,假若在类形式那么就象征当前类,假诺在对象方法那么就意味着”当前调用该方法的目的”

super关键字

super 也是一个指针,指向当前类的靶子中父类的成员。

  • super代表类的生父
  • [super
    init]是打招呼父类区做底层的开首化操作。
  • super是指向目的中两次三番过来的父类部分的指针。
  • 运用super可以调用由于子类重写而被隐形的父类函数。

2. OC中目的类型和非对象类型

2.1 概念

1) 对象类型,@interface定义的类,可以成立对象。所以那连串型叫对象

2) 非目的类型,OC语言是完全匹配C语言,所以C语言中的基本数据类型,结构体,枚举等在OC都可以用,那个项目叫非对象类型。

2.2 内存分配

1) OC中拥有的对象都在堆中。但针对对象的引用只怕在栈中,当然也说不定在全局区,或堆中。

2) OC中具备的对象类型的参数传递都以地点传递,大家只好将对象的地址传给一个函数或格局,无法将对象自小编传给函数或措施。

3) OC中的非对象类型,内存分配或然会在栈中,或全局区。也说不定在堆中(当做为1个对象的属性时)

3. OC语言中时常应用的非对象类型

3.1 基本数据类型

  NSInteger:

    typedef
int NSInteger;(32位系统)   

    typedef
long NSInteger;(64位系统)

    在32bit的iOS系统中,NSInteger是5个字节,而在64bit系统中,是几个字节。那样做的包容性好。 

    所以,在iOS实际费用中,尽量接纳NSInteger来定义变量,属性,参数等,而不用采纳int或long等。

  NSUInteger: 是无符号的NSInteger

  typedef unsigned
int NSUInteger;(32位系统)

    typedef
unsigned long NSUInteger;
(64位系统)

  CGFloat:

  在32bit的iOS系统中,CGFloat是六个字节,约等于float类型;而在64bit系统中,是七个字节,也就是double,那样做的包容性好。

  所以,在iOS实际付出中,尽量利用CGFloat来定义变量,属性,参数等,而不要使用float或double等。

     typedef
double
NSTimeInterval; //NSTimeInterval
是double类型,寻常用于表示时间(多少秒)

  BOOL: 

  逻辑数据类型BOOL

  C语言中布尔类型:bool b1 = false; //true 1 false 0

  Objective-C中布尔类型:  BOOL
b2 = YES;
//YES 1 NO 0

3.2 结构体:CGPoint、CGSize、CGRect、NSRange

     C语言 1

3.3 实际的iOS开发中时时定义的全局常量

亟需在二个文件中宣示全局常量,再在1个.m文书中定义全局常量。那么些常量就可以在动用的别样地方应用了。使用前须求#import头文件

3.4 枚举

OC语言中利用的枚举就是C语言中的枚举

C语言,OC语言将来应用枚举都以服从C++11的标准规范定义。C++11中显然,枚举值可以显然类型。

enum 枚举类型名 : 枚举值类型{枚举值…};

OC语言中定义枚举使用新的法子:

typedef NS_ENUM(枚举值类型, 枚举名){…};

typedef
NS_OPTIONS(枚举值类型, 枚举名){…};

4. OC语言基本编程规范 

怎么定义类名,方法名,属性名,代码风格….

4.1 标准符(identifier )

给类,属性,方法,变量,结构体,枚举等起的名字

最中央的分明,违反规定会促成编译错误

1) 必须以字母或下划线起首

2) 可以蕴含字母、下划线和数字

  +-*/肯定是相当的

3) 无法和重大字冲突  float int = 3.14;//E安德拉RO中华V

4) 大小写敏感(case sensitive)

5) 长度不限

4.2 命名规范

1)类,分类,伸张,协议,结构,枚举等品类起名时,一般要加前缀

TRMyFirstClass: TR是前缀

NSString : NS是前缀

CGPoint : CG是前缀

UIButton : UI是前缀

首要目的是减小命名争执。苹果公司暗中同意保留全体多个假名前缀的任务,所以非苹果官方的类指出都应用七个假名的前缀。

2)使用驼峰命名方式

  • 给类,分类,增添,协议,结构,枚举等体系起名时,每一种单词的首字母大写。(如:TPAJEROMyFirstClass)
  • 给属性、方法、变量起名时,第②个单词的首字母小写,其他单词的首字母大写。

mySalary

setName:

isGirl

changeYourName:

3) 一般采用#define定义的宏都以大写的

但是,OC中,不提议大批量使用宏。即使要定义常量,应该在头文件中宣称,在.m中定义,命名使用驼峰形式

4.3 特殊措施的命名

1)初步化方法

无参的初始化方法肯定叫”init”

有参的开端化方法肯定以”initWithXxx..”开始,后边单词首字母大写

2)工厂方法

多方工厂方法的名字都是类名开首(首字母小写),假使有参数,加With

+ point

+ pointWithX:…

有特异意义的法子可以不屈从这几个显然,比如

UIColor类中的 red, green, blue等类措施

3) 普通方法

一般的实例方法和类情势尽量不要以new发轫。因为以new起首的方法往往是用来成立对象的,系统会做特殊的内存管理。

[TRPoint new]; ==> [[TRPoint alloc]init];

4.4 别的急需留意的事项

1) 代码一写要有缩进,代码就有层次感

2) 当二个措施的参数较多时,可以分多行,每行将用”:”号对齐

3) 方法毫无太长,争取一屏能显得得下八个主意的有所代码

如若艺术太长,可以拆成几何个民用方法。

  1. @class

#import:

  • 鉴于import是多个预编译指令, 他会将””中的文件拷贝到import所在的职责
  • 同时import有2个特征, 只要””中的文件发出了变更, 那么import就会重新拷贝五次(更新操作)

@class:

  • @class仅仅是报告编译器, @class后边的名称是3个类, 不会做其余拷贝操作
  • 留神: 由于@class仅仅是告诉编译器后边的称谓是3个类, 所以编译器并不知道这几个类中有何样属性和方法, 所以在.m中接纳那几个类时须要import这些类, 才能采取
  • 在.h中用@class可以荣升编译作用

是因为在.h中用@class,在.m中用import,借使3个文件发出了变更,唯有和那些文件有一直关联的不胜文件才会另行拷贝

       

        Q:即便三个类相互拷贝,例如A拷贝B,B拷贝A,那样会报错

        A:因为如若.h中都用import, 那么A拷贝B, B又拷贝A,
会形成死循环

               怎样化解?

             在.h中用@class, 在.m中用import

             借使在.h中用@class, 那么不会做别的拷贝操作,
而在.m中用import只会拷贝对应的文书, 并不会形成死循环

  • 在其实费用中,在.h中要利用某些类建议用@class,在.m中要选取有些类用#import