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