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

1. self关键字 

self 是一个指南针,哪个目标调用方法就是凭谁目标,其打算是分别不同对象。

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

现阶段目标,通过哪个目标调用了这个法子,方法被之self就对十分目标。这个目标就为当前对象.

1.2 在近似方式吃的self,代表时好像

看似措施吃,self代表类方式所在的类本身。所以当相近方式吃,self会被直接当类来利用

咱俩推荐在看似方式应用self代替类,因为便宜子类继承

总结:

万一self在靶方法吃,那么self就意味着调用当前目标方法的深目标

设self在接近措施被,那么self就意味着调用当前接近措施的酷看似

咱们才所以关爱self在啊一个法被,如果以看似方式那么即使代表时相近,如果当目标方法那么就算表示”当前调用该措施的目标”

super关键字

super 也是一个指南针,指向当前看似的目标被父类的分子。

  • super代表类的爹爹
  • [super
    init]举凡通父类区做底层的初始化操作。
  • super是借助为目标吃继承过来的父类部分的指针。
  • 应用super可以调用由于子类重写如吃隐形的父类函数。

  • OC中目标类型及非对象类型

2.1 概念

1) 对象类型,@interface定义的类,可以创建对象。所以这种类型为对象

2) 非目标类型,OC语言是意配合C语言,所以C语言中的中坚数据列,结构体,枚举等在OC都可以用,这些项目叫非对象类型。

2.2 内存分配

1) OC中具有的靶子都于积中。但针对对象的援可能在栈中,当然为或于全局区,或堆着。

2) OC中颇具的目标类型的参数传递都是地点传递,我们只好将目标的地点传被一个函数或措施,不可能拿对象自我传于函数或方式。

3) OC中的非对象类型,内存分配可能会见以栈中,或全局区。也或在积着(当做为一个靶的特性时)

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

3.1 基本数据类

  NSInteger:

    typedef
int NSInteger;(32位系统)   

    typedef
long NSInteger;(64位系统)

    在32bit底iOS系统中,NSInteger是4只字节,而当64bit系统中,是8个字节。这样做的兼容性好。 

    所以,在iOS实际开支中,尽量使用NSInteger来定义变量,属性,参数等,而毫不用int或long等。

  NSUInteger: 是无符号的NSInteger

  typedef unsigned
int NSUInteger;(32位系统)

    typedef
unsigned long NSUInteger;
(64位系统)

  CGFloat:

  于32bit之iOS系统面临,CGFloat是4个字节,相当给float类型;而于64bit系统中,是8只字节,相当给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开发被经常定义的大局常量

亟待以一个文本中宣示全局常量,再于一个.m文书中定义全局常量。这个常量就可以以应用的外岗位应用了。使用前要#import头文件

3.4 枚举

OC语言中使的枚举就是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;//ERROR

4) 大小写敏感(case sensitive)

5) 长度不限

4.2 命名规范

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

TRMyFirstClass: TR是前缀

NSString : NS是前缀

CGPoint : CG是前缀

UIButton : UI是前缀

根本目的是减多少命名冲突。苹果商店默认保留有片单字母前缀的权,所以未苹果官方的切近建议都以三单字母的前缀。

2)使用驼峰命名方式

  • 让类,分类,扩展,协议,结构,枚举等品种起名时,每个单词的首字母大写。(如:TRMyFirstClass)
  • 深受属性、方法、变量起名时,第一个单词的首字母小写,其他单词的首字母大写。

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有一个特征, 只要””中之文书发出了扭转, 那么import就见面更拷贝一坏(更新操作)

@class:

  • @class仅仅是告诉编译器, @class后面的名目是一个类, 不会见召开其他拷贝操作
  • 专注: 由于@class仅仅是报告编译器后面的名是一个接近, 所以编译器并不知道这个看似中产生哪些性和章程, 所以在.m中利用此类时需要import这个看似, 才会使
  • 在.h中之所以@class可以升级编译效率

是以在.h中之所以@class,在.m中因故import,如果一个文本发出了变化,只有和此文件发出直接涉及之不得了文件才见面重复拷贝

       

        Q:如果简单单近乎相互拷贝,例如A拷贝B,B拷贝A,这样见面报错

        A:因为如果.h中还因此import, 那么A拷贝B, B以拷贝A,
会形成死循环

               如何解决?

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

             如果在.h中因故@class, 那么非见面举行任何拷贝操作,
而在.m中因故import只见面拷贝对应的文本, 并无会见形成死循环

  • 以实际开支被,在.h中使运用某个类建议用@class,在.m中一经运有类用#import