博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC基础概念
阅读量:6180 次
发布时间:2019-06-21

本文共 4366 字,大约阅读时间需要 14 分钟。

目录结构

一.控制C

二.数据类型D

三.封装及复用E:类(class)、协议(protocol)、类别(category)、扩展(extension)、结构体(struct)、函数(function)、闭包(block)

四.组织结构O:文件类型、导入、访问控制、全局变量

五.库L

 

一.控制C

1.1 条件控制

1.1.1 if else

if(表达式1){

   语句1;
}else if(表达式1){
    语句2;
}else if(表达式1){
    语句2;
}else{
    语句4;
}

1.1.2 switch case

switch(表达式){

         case 1:
         语句1;
         case 2:
         语句2;
         default:
         语句4;
}

1.2 循环控制

 1.2.1 do while与while

while(表达式){

        语句1;

do{

    语句1;
}while(表达式);

1.2.2 for

for(语句1;表达式;语句3){

     语句2;

 //break;

   //continue;

}

二.数据类型D

 基本类型

 

整型 int  %d.%i 短整型short int %hd.%hi 长类型 long int  %ld.%li
无符号短整型 unsigned int %u 无短整型 unsigned short %hu 无符号长整型 unsigned long %lu
浮点型 float %f 双精度型 double %f 长双精度型 long double

%lf

字符型 char  %c 结构体变量  struct   通用的指针类型 id 
布尔值 YES/NO(1/0) 枚举类型 enum    

 

三.封装及复用 

 3.1类class

  • 类定义在两个不同的部分,即 @interface 和 @implementation

  • 类声明由@interface与@end包裹,一般放于.h文件中

    类实现由@implementation与@end包裹,一般放于.m文件中

  • 类继承用符号:表示。示例如下:
#import 
//NSObject是根类,SomeProtocol是个自定义的协议(示范用)@interface Box:NSObject
{
  //实例变量 double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box}@property(nonatomic, readwrite) double height; // Property//实例方法(对象方法)只能由实例(对象)调用-(double) volume; //类方法+(void) test;@end@implementation Box@synthesize height; -(id)init{ self = [super init]; length = 1.0; breadth = 1.0; return self;}-(double) volume{ return length*breadth*height;}+(void) test {
   printf("test"); }@end

 

3.2协议protocol

  ·协议中有2个关键字可以控制方法是否要实现,@required(默认,必须实现)和@optional(可选)

  ·实现协议是将协议放到尖括号<>中,位于类名之后;

  ·多条协议以逗号分开

@protocol ProtocolName@required// list of required methods@optional// list of optional methods@end

 

3.3分类category与扩展extension

3.3.1分类category

  • 分类可以在不修改原来类的基础上,为一个类扩展方法。分类中只能添加“方法”,不能增加成员变量(本类的实例无法通过点语法直接获取,但是可以通过实现这个变量的setter getter来获取)
  • 最主要的用法:给系统自带的类扩展方法。
  • 在本类和分类有相同的方法时,优先调用分类的方法再调用本类的方法
  • 如果有两个分类,他们都实现了相同的方法,如何判断谁先执行?分类执行顺序可以通过targets,Build Phases,Complie Source进行调节,注意执行顺序是从上到下的

示例:

分类定义声明:

Person+sport.h文件

分类实现:

Person+sport.m文件

3.3.2扩展extension

  • 扩展(extension)是category的一个特例,有时候也被称为匿名分类
  • 类扩展即可以声明成员变量又可以声明方法。
  • 类扩展可以定义在.m文件中,这种扩展方式中定义的变量都是私有的,也可以定义在.h文件中,这样定义的代码就是共有的
  • 类扩展中添加的新方法,一定要实现;category中没有这种限制
  •  @interface 本类名()//这就是类扩展的声明写法 @end

示例:

声明——

实现——

 

4.结构体struct

  • 结构体是种值类型
  • 结构体成员可以通过点语法来读写
  • 结构体变量可以通过赋值方式直接定义
  • 结构体作为参数时类型前要加struct关键字,如 - (void) printBook:( struct Books) book

结构体语法:

struct [structure tag]{   member definition;   member definition;   ...   member definition;} [one or more structure variables];

 示例:

// 结构体类型名为 MyDate1struct MyDate1 {    int year;    int month;    int day;};        // 结构体类型变量为 d1,并赋值struct MyDate1 d1 = {2016, 1, 6};    // 结构体类型变量值的调用    NSLog(@"d1: %d/%d/%d", d1.year, d1.month, d1.day);

 

5.函数/方法function

不同于常用语言如java等语言的前缀表达方式,OC里的方法命名采用中缀表达方式来定义。

语法:

(返回值类型)方法主名:(参数1类型)变量1名 参数2名:(参数2类型)变量2名 参数3名:(参数3类型)变量3名;

附:

(3 + 4) × 5 - 6 中缀表达式

- × + 3 4 5 6 前缀表达式
3 4 + 5 × 6 - 后缀表达式

前缀中缀指的是操作符相对于操作数的位置

 

6.闭包block

  • 跟常见闭包概念不同的是,block可以起别名,如下面blockName就是
returntype (^blockName)(argumentType)= ^(argument){};

 

四.组织结构

4.1文件类型

oc的代码文件(不含配置文件等)有.h .m两种。

.h头文件是对外开放的api

.m文件是api的实现

4.2导入

OC使用#import和@class来引用别的类型。

  •  import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你;
  • 在头文件中,一般只需要知道被引用的类的名称就可以了,不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称,而在类的实现部分,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。
  • 在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次被引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。
  • 如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。

所以,一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.

4.3访问控制

  •  OC中关键字@private @public @protected @package只能用来修饰成员变量,成员方法的控制不是通过关键字,而是通过加减符号+-来控制的。
  • +表示方法是类方法,可以通过类名直接调用,—表示方法是对象方法,只能通过类的实例对象来访问。
  • 严格说来加减号不属于访问控制作用,只是定义了方法的类型。那方法的访问控制怎么实现呢?其实将方法放入.h头文件就意味着public了,而放在.m文件中则意味着非public。
  • 那.m中的私有方法如何声明呢?请看下面@static

4.4变量修饰

 

@extern用来修饰全局变量,如果在其他文件中访问一个类的全局变量,可以不用导入.h文件,可以通过extern去直接访问;

@const用来修饰常量;

@static修饰静态变量或方法。

static使用注意:

 

  • 非静态全局变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
  • 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用

 

 

 

 

参考:

http://www.cnblogs.com/SnowStark/p/5614627.html

http://www.cocoachina.com/ios/20161018/17784.html

http://blog.csdn.net/guitk/article/details/7712679

http://www.jianshu.com/p/3fa703e80720

你可能感兴趣的文章
Scala中的Map
查看>>
C++ STL源码剖析(转)
查看>>
记录一次bug解决过程:mybatis中$和#的使用
查看>>
Java非静态内部类中为什么不能有静态变量却可以有常量?
查看>>
DevExpress DXperience 的本地化(汉化)方法
查看>>
处理分页操作
查看>>
$.when().done().then()的用法
查看>>
EntityFramework之创建数据库及基本操作(一)
查看>>
【mongo】drop不释放磁盘空间
查看>>
linux异步通信之epoll【转】
查看>>
暑假总结20160907
查看>>
数据结构——树的知识架构图
查看>>
OTL翻译(3) -- OTL的主要类
查看>>
x86架构的android手机兼容性问题
查看>>
InvalidIndexNameException[Invalid index name [2Shard], must be lowercase]
查看>>
POJ 1067 取石子游戏
查看>>
sum函数
查看>>
常用音频数据库记录
查看>>
题二:写一个单例模式
查看>>
40个Java多线程问题总结
查看>>