OC简介

语言简介

  • 完全兼容C语言
  • 通过LLVM(LowLevelVirtualMachine)编译器架构,支持与swift的双向互通

OC编译过程.png
ios开发平台.png

  • 时空角

    • 时(compileTime VS runtime)
    • 空(stack VS heap)
    • 角(programmer VS compiler/runtime/framework)

      开发方式

      命令行

  • clang或gcc命令行 ```shell clang -fobjc-arc HelloWorld.m -o HelloWorld

gcc -v gcc main.c => a.out ./a.out

编译

cc -c mian.c => main.o

链接,增加启动代码

cc main.o => a.out

执行

./a.out

  1. <a name="yka4X"></a>
  2. ### IDE
  3. - Xcode
  4. - 构建大型项目,追求质量和代码组织
  5. <a name="29DC2"></a>
  6. ## 代码基础
  7. - Mac上不能直接写NTFS格式的硬盘,需要TuxeraNTFS软件
  8. - C语言开发步骤
  9. 1. 编码 touch main.c
  10. 2. 编译 cc -c main.c => main.o
  11. 3. 链接 cc main.o => a.out (源码增加启动代码)
  12. 4. 执行 ./a.out
  13. - .h是头文件,.m是实现文件
  14. - #import优于#include,解决了循环依赖的问题
  15. <a name="REOpx"></a>
  16. # 类与对象
  17. <a name="PXTWt"></a>
  18. ## 类型系统
  19. - 引用类型ReferenceType
  20. - 类class
  21. - 指针pointer
  22. - 块block
  23. - 值类型ValueType
  24. - 基础类型
  25. - 结构struct
  26. - 枚举enum
  27. <a name="Mg78X"></a>
  28. ## 类型装饰
  29. - 协议 protocol
  30. - 类别 categary
  31. - 扩展 extension
  32. <a name="0vrD4"></a>
  33. ## 类与结构
  34. | | 类 | 结构 |
  35. | --- | --- | --- |
  36. | 类型与实例 | 类与对象 | 结构与值 |
  37. | 类型 | 引用类型 | 值类型 |
  38. | 面向对象 | 有属性、有方法(-表示实例方法 +表示类方法) | 只有属性、没有方法 |
  39. | 内存结构 | 引用位于栈上的指针,指向堆上的对象 | 实例直接位于栈中 |
  40. | 空间分析图 | 下图1 | 下图2 |
  41. ![对象的空间分析.png](https://cdn.nlark.com/yuque/0/2020/png/1491874/1602160314564-ae42fa5d-bc19-4941-b614-7e93be1cd58b.png#height=1134&id=c8bo6&originHeight=1134&originWidth=1780&originalType=binary&ratio=1&rotation=0&showTitle=false&size=463244&status=done&style=none&title=&width=1780)<br />![值的空间分析.png](https://cdn.nlark.com/yuque/0/2020/png/1491874/1602160321067-b8806e3b-eb0f-4c5c-9a5f-5da4144fd5b3.png#height=1136&id=ZUQ2K&originHeight=1136&originWidth=1526&originalType=binary&ratio=1&rotation=0&showTitle=false&size=295524&status=done&style=none&title=&width=1526)
  42. <a name="Qqlfv"></a>
  43. ## 堆栈
  44. <a name="8e34r"></a>
  45. ###
  46. | 堆 | 栈 |
  47. | --- | --- |
  48. | 存储引用类型对象 | 存储值类型 |
  49. | 创建对象时需要手动请求分配空间,释放由运行时ARC机制自动释放 | 无ARC负担,由系统自动管理,以函数为单位,函数执行时自动分配stack,执行完毕自动回收 |
  50. | 具有全局性,空间大小受系统限制,超出会报OOM | 空间大小编译时确定(参数+局部变量)具有局部性,大小有限额,超出会报SOF |
  51. | 函数之间通过拷贝引用传递 | 函数之间通过拷贝值传递 |
  52. <a name="XHXYL"></a>
  53. # 类型成员
  54. <a name="PCS4w"></a>
  55. ## 数据成员
  56. DataMember,描述对象状态
  57. - 实例变量 instanceVariable
  58. - 只在类内部访问
  59. - 生存周期
  60. - 实例变量的存储是跟随对象实例存储在堆上
  61. - 值类型的实例变量内嵌在对象实例上,跟随对象实例的释放而被释放
  62. - 引用类型的实例变量通过指针“引用”堆上的类型实例
  63. - 属性 property
  64. - 描述对外接口,默认编译器会为属性定义propertyName自动合成以下内容
  65. - getter访问器 propertyName
  66. - setter访问器 setPropertyName
  67. - 实例变量 _propertyName
  68. - 类外部使用一律使用属性访问
  69. - 类内大多通过self使用属性访问,只有以下情况使用实例变量访问
  70. - 初始化器 init
  71. - 析构器 dealloc
  72. - 自定义访问器方法
  73. - 属性的描述特性attribute,指定属性不同环境下不同功能
  74. - 读写特性
  75. - readwrite 默认
  76. - readonly
  77. - 多线程特性
  78. - atomic 默认
  79. - nonatomic
  80. - 内存管理特性
  81. - ARC环境
  82. - strong 默认
  83. - weak 弱引用,阻止循环引用,防止内存泄漏
  84. - copy 创建独立拷贝,防止引用连带
  85. - 其他情况
  86. - retain
  87. - assign
  88. - unsafe_unretained
  89. <a name="ZHQ71"></a>
  90. ## 函数成员
  91. FunctionMember,描述对象行为
  92. - 方法 method
  93. - 分类
  94. - 全局函数(C语言函数)
  95. - 成员函数(OC方法)
  96. - 所有方法默认为公开方法,没有private或protected
  97. - 动态消息分发:方法调用通过运行时动态消息分发实现,在对象上调用方法又称给对象发送消息
  98. - 修饰符号
  99. - -表示实例方法,可以访问
  100. - 实例变量
  101. - 实例属性
  102. - 实例方法
  103. - 类静态变量
  104. - 类方法
  105. - +表示类方法,可以访问
  106. - 类静态变量
  107. - 类方法
  108. - 方法参数
  109. - 如果参数为值类型,则为传值方式
  110. - 如果参数为引用类型,则为传指针方式
  111. - 方法可以没有参数,也可以没有返回值
  112. - 如果方法有参数,方法名约定包含第一个参数名,从第二个参数开始需要显式提供外部参数名
  113. - 调用时第一个参数名忽略,后面的参数名显式标明
  114. - 动态方法调用机制——消息分发表,id类型的obj可以通过指针指向的methodlist找到真正的方法内存地址,即可以通过id类型调用方法
  115. - 初始化器 init
  116. - 对象初始化器
  117. - -(id) init
  118. - 可以重载多个
  119. - 初始化对象实例时,init通常和alloc搭配使用
  120. - alloc
  121. - NSObject已实现,不用自定义
  122. - 在堆上分配合适大小的内存
  123. - 将属性或实例变量的内存置为0
  124. - init
  125. - 需要自定义
  126. - 首先调用父类的初始化器[super init]
  127. - 初始化当前对象的实例变量,这里不能使用属性
  128. - new 调用相当于alloc和init的无参版本
  129. ```objectivec
  130. -(id) initWithName:(NSString*) name WithPages(int) pages
  131. {
  132. self = [super init]
  133. if(self){
  134. _name = [name copy]
  135. _pages = pages
  136. }
  137. return self;
  138. }
  • 类型初始化器
    • +(void) initialize
    • 只能有一个,负责类型的初始化
    • 在每个类使用之前被系统自动调用,且每个进程周期只能被调用1次,无法手动调用
    • 子类的initialize会自动调用父类的initialize
      • 析构器 dealloc(用于释放对象拥有的资源,是一个没有返回值的函数)
  • 对象析构器
    • -(void) dealloc
    • 只能有一个,负责释放对象拥有的动态资源
      • 自动实现,ARC将对象属性引用计数减持
      • 手动实现,释放不受ARC管理的动态内存,如malloc分配的内存
      • 手动实现,关闭非内存资源,如文件句柄、网络端口
    • dealloc由ARC根据对象引用计数规则,在释放对象内存前自动调用,无法手动调用
    • 子类的dealloc会自动调用父类的dealloc(后置调用)

      继承和多态

      继承

  • 一个类型在另外类型基础上进行的扩展实现,所有类的基类NSObject
  • 每个类只能有一个基类,子类自动继承基类的
    • 实例变量,使用->访问
    • 属性
    • 实例方法
    • 类方法
  • 继承的两层含义
    • 成员复用,子类复用基类成员
    • 类型抽象,将子类当作父类来使用【IS-A关系】
  • init
    • 子类自动继承父类的初始化器
    • 子类可以重写父类的初始化器,此时必须手动调用父类的一个初始化器
  • dealloc
    • 子类可以选择继承父类的析构器,也可以重写
    • 子类析构器执行完毕后会自动调用父类的析构器(后置调用且不支持手动调用)
  • 尽量避免在父类init和dealloc中调用子类重写的方法

    多态

  • 不同类型针对同一接口的不同实现方式

  • 子类在父类统一行为接口下表现出不同的实现方式
  • 重写和重载
    • 重写:子类重写父类同名同参方法:子类只可以重写父类方法
    • 重载:方法名相同,参数不同:OC不支持重载
  • 子类的代码中,可以使用super来调用父类的实现
  • self具有多态性,可以指向不同的子类
  • super没有多态性,仅指向当前父类