OC思想与基础语法

OC简介

  • C语言的基础上,Objective - C增加了一层最小的面向对象语法

  • 完全兼容C语言

  • 可以在OC代码中混入C语言,甚至是C++代码

  • 可以使用OC开发Mac OS X平台和iOS平台的应用

  • OC是面向对象的,C是面向过程的,只是解决问题的不同思想

  • 面向对象(关注解决问题需要哪些东西)如,打电话找手机

  • 面向过程(关注解决问题需要哪些步骤)如,打开手机,按号码,拨打

  • 面向对象封装的好处

    • 更接近人类的思考方式
    • 只需要关注对象,不需要关注步骤

OC语法概括

  • 基本所有关键字都是以@开头
    @interface、@implementation、@end、@public、@protected
    @private、@selector、@try、@catch、@throw、@protocol
    @optional、@required、@class、@property、@synthesize
    
    self、super、id、__cmd、__block、__strong、__weak
    
  • 字符串以@开头
    比如@"Hello"OC中的字符串,而"Hello"则是C语言中的字符串
  • 其他语法
基本数据类型 int、char、float、double、BOOL(YES\NO)[本质是char]
nil 相当于C语言中的NULL,也就是 0
基本语句 循环语句do while 、while 、for、条件语句if、if-else、switch
注释 //单行注释、/*...*/多行注释
屏幕输出 NSLog(@"Hello");NSLog(@"age is %i",24);会自动换行

OC程序的开发过程

.m源文件-> 编译 ->.o目标文件-> 链接 ->a.out可执行文件

OC基础知识

  • #import的用途

    • #include一样,拷贝文件的内容
    • 可以自动防止文件的内容被重复拷贝
  • 类和对象的关系

    • OC中的类相当于造东西的图纸,用来描述一类事物,也就是说,要想创建对象,必须先有类
    • 利用来创建对象,对象的具体存在
    • 面向对象解决问题应该是,先考虑需要设计哪些,再利用类创建多少个对象
    • 每个 "对象" 内部默认有个 "isa 指针" 指向它的类
    • 所有 "对象" 共用一份方法
    • 每个类中有个“superclass 指针”指向它的父类
  • 需要设计哪些,如何设计

    • 的设计,只关心3样东西

      • 类名(事物名称):人(VampireJune)
        • 第一个字母必须是大写
        • 不能有下划线
        • 多个英文单词用驼峰标识
      • 属性(配置) :身高(height)、年龄(age)
      • 行为(功能):跑(run)、吃(eat)
    • 一般名词都是

    • 拥有相同(或类似)属性和行为的对象都可以抽出一个

  • 完整地写一个声明实现

    // 引入 "Foundation" 框架,因为使用了 "NSObject"
    #import 
    
    1. 类的声明:声明对象的属性和行为
    @interface VampireJune : NSObject 
      // 关键字 "@interface" 和 类名 "VampireJune" 之间必须有一个空格
      // NSObject  目的是:让 "VampireJune" 这个类具备创建对象的能力
      // ":" :类名 "VampireJune" 和 "NSObject" 之间的冒号是继承语法
    {// 大括号里 "只能" 用来声明 "对象属性"( 实例变量\成员变量)默认会初始化为0
    
      // @public 可以让外部的指针间接访问对象内部的成员变量
      @public //  "属性" (成员变量)默认是被保护的,不允许指针直接访问
      int age; // 年龄,属性命名完,写一个 ";" 英文分号,告诉这个属性结束了
      double weight; // 体重
    } // 大括号里 "只能" 用来声明 "对象属性",必须要有 大括号
    
    // 方法(行为): 方法名、参数、返回值
    // 声明:在 "@interface @end" 中声明,不能放到大括号内
    // 实现:在 "@implementation @end" 中实现
    - (void) run;
    // 只要是OC对象的方法,必须以减号 "-" 开头
    // OC方法中任何数据类型都必须用小括号 "()" 括住
    // OC方法中的小括号 "()" :括住数据类型 
    @end  // 表示类声明完毕
    
    2. 类的实现
    // 用来实现 "@interface @end" 中声明的方法
    @implementation VampireJune
    // 方法的实现(说清楚方法里面有什么代码)
    - (void) run
    {
      // 访问自己对象内部的属性,直接写属性名
      NSLog(@"%d岁、%f公斤的人跑起来了",age,weight);
      * "对象" 调用某个方法,会跟随 "isa 指针" 找到对应的类,在类里面找一找有没有这个方法
      * 一旦发现有,就调用这个方法,来到方法对应的代码,访问当前对象的成员变量
    }
    
    @end
    
    int main()
    {
      // 在OC中,想执行一些行为,就写上一个中括号 [行为执行者 行为名称];
      // 利用类来创建对象
      // 执行了 "VampireJune" 这个类的 "new" 行为来创建新对象
      //  [VampireJune new] 会创建出一个新对象,并返回新对象本身(新对象地址)
    
      // OC中想修改操纵对象,只能用指针
      // 定义了一个指针变量 "v",将来指向 "VampireJune" 类型的对象
      VampireJune *v = [VampireJune new];
    
      // 给 "v" 所指向的对象的 "age" 属性赋值 
      v->age = 23;
      v->weight= 60.0;
      NSLog(@" age is %d,weight is %f",v->age,v->height);
    
      // 给 "v" 所指向对象 发送一条 "run" 消息(OC的消息机制)
      // 就会调用 这个对象的 "run" 方法,就会去对象的实现里面找这个方法
      // 一旦找到这个方法,就会执行这个方法里面的代码
      [v run]; 
      return 0;
    }
    
    
  • @implementation

    • 没有@interface,只有@implementation,也能成功定义一个类
    • @implementation中不能声明和@interface一样的成员变量
@implementation Car : NSObject
{
  @public
  int wheels; // 轮子
  int speed; // 速度
}

- (void)run
{
  NSLog(@"%d个轮子,%dkm/h的车跑起来了",wheels,speed);
}
@end
  • 对象函数参数
    • 对象成员变量作为函数参数
    • 指向对象的指针作为函数参数
      • 修改指向对象的成员
      • 修改指针的指向

常见错误

  • 只有类的声明,没有类的实现
  • 漏了@end
  • @interface@implementation嵌套
  • 两个类的声明嵌套
  • 成员变量没有写在括号里面
  • 方法的声明写在了大括号里面

语法细节

  • 方法不能当做函数一样调用
  • 成员变量不能在{}中进行初始化、不能被直接拿去访问
  • 类的实现可以写在main函数的后面,一定写在类的声明后面就可以

对象方法和函数的区别

  • 对象方法

    • 对象方法都是以减号-开头
    • 对象方法必须声明在 "@interface @end" 之间,必须实现在 "@implementation @end"之间,对象方法不能独立与类存在
    • 对象方法只能由对象调用
    • 对象方法类\对象所有
    • 对象方法中能访问当前对象的成员变量(实例变量)
  • 函数

    • 函数不属于类,跟类没有关系,只归定义函数的文件所有
    • 函数能写在文件中的任意位置("@interface @end"之间)
    • 函数内部不能直接通过成员变量名访问某个对象的成员变量

对象方法的声明规范

  • 方法首字母小写
  • 从第二个单词开始,首字母大写
  • 尽量写的像句子一样,可读性好
  • 形参首字母小写,超过一个单词,其他首字母大写
  • 形参与形参之间,一定要有一个空格
  • 一个形参对应一个冒号,冒号也是方法名的一部分
  • 返回值永远只有一个
  • 类方法声明规范上面全部适用,只是减号-变为加号+
  • 同一个类中不允许有两个对象方法同名
// 1. 无返回值
// 1.1 无形参
-  (void)pi; // 方法名 :-pi
// 1.2 有形参
-  (void)squareWithNum:(int)num; // 方法名 :-squareWithNum: 

// 2. 有返回值
// 2.1 无形参
-  (int)pi; // 方法名 :-pi
// 2.2 有形参
-  (int)sumWithNum1:(int)num1 andNum2:(int)num2; 
// 方法名 :-sumWithNum1: andNum2:

对象方法图例

//  无形参 有返回值
-  (double)pi; // 方法名 :-pi

// 方法调用
[c pi];
方法解析1.jpg
方法调用1.jpg
//  有1个形参 有返回值
-  (double)square:(double)number; // 方法名 :-square: 

// 方法调用
[c square: 10];
方法解析2.jpg
方法调用2.jpg
//  有多个形参 有返回值
-  (double)sumOfNum1:(double)num1 andNum2(double)num2; 
// 方法名 :-sumOfNum1: andNum2:

// 方法调用
[c sumOfNum1: 10 andNum2: 21];
方法解析3.jpg
方法调用3.jpg

你可能感兴趣的:(OC思想与基础语法)