iOS学习路之Objective-C(一)

1:类和对象

  1:oc简介

    1:oc是完全兼容c的

    2:oc在c的基础上增加一层最小的面向对象的语法

    3:写oc工程的时候可以混入c的代码,甚至是c++的代码

    4:通过oc语言可以开发ios或os x平台下应用程序

  2:编程思想

    1:面向过程

    2:面向对象

  3:面向过程编程

    面向过程编程代表:c

    过程:实现某个应用程序所经历的步骤,每一个步骤对应一个功能,该功能可以通过一个自定义的函数来实现

    面向过程编程:首先分析实现该应用程序功能需要经历几个步骤,每个步骤通过一个自定义的函数来实现,最后把所有的函数进行整合,实现整个程序功能

    例子:

      在有序数组中插入一个数

      1:输入————>input

      2:输出————>output

      3:排序————>sort

      4:输出————>output

      5:插入————>insert

      6:输出————>output

 

      整合:input,output,sort,insert

  4:面向对象编程

    面向对象编程代表:c++, java, oc

    类:类就相当于图纸,类中有对象的属性和行为

    对象:对象就是类的实例化,根据类中不同的属性值和具体的行为实例化出不同的对象

    面向对象:关心的是需要创建多少个类,实例化多少个对象,调用对象的那些方法

    面向对象编程:首先要知道谁(对象)既有解决程序功能,将对象的属性和行为进行封装形成了类,通过类实例化出对象,调用对象的方法实现程序功能    

    1:类和对象

      1:现实生活

        类     对象

        人     陈超(开放式教学),比尔盖茨(微软),乔布斯(Apple),马云(淘宝)

        美女      高圆圆,陈意涵,熊黛林,梁静茹,周冬雨,张雨绮,吴佩慈

        帅哥   陈超,chen chao, I, I am, Me , Me too, Yes i am, 吴彦祖,1516全体男人

        猫       哆啦A梦,蓝猫,加菲猫,Tom,叮当猫,龙猫,大熊猫

        狗       旺财,大黄,小白,小黑,秋田,啸天犬,小泉

    2:封装的角度

      结构体:是对不同数据类型变量的封装 struct student    {      int num;       char name[20];    };

      函数:是对功能代码的封装

int add(int a, int b)    { int c = a+b;       return c;    }

      类:类是对数据和代码的封装

      对象:对象就是类的实例化

    3:编程的角度

      类:就是一个自定义的数据类型(类中既有属性又有方法)

      对象:同过类这种自定义的数据类型定义出的变量

    4:官方的角度

      类:对象属性和行为的抽象

      对象:类的实例化

 

    5:总结

      1:对象

        世间万物皆对象,对象是类的实例化

      2:类

        具有相同或相似性质的对象的抽象就是类。

        对象的抽象是类,类的实例化是对象。

      3:对象的属性和行为

        对象具有属性,通过数据值来描述它的属性

        对象具有操作,用于改变对象的属性值,操作就是对象的行为

        对象实现了数据和操作的统一封装

      4:类的属性和行为

        类具有属性,他是对象属性的抽象,用数据结构来描述类的属性。

        类具有操作,他是对象操作的抽象,用函数的声明和实现来描述类的操作。

      5:具体事例理解类和对象

        例子:生产车

          生产车的图纸:车的相关属性(轮子个数,时速)和行为(跑)

          车:根据图纸中车的不同的属性值和具体的行为

        例子:自行车

          属性:

            轮子个数:2

            时速: 20km/h

          行为:

            跑:以20km/h速度跑起来

 

        例子: 三轮车

          属性:

            轮子个数:3

            时速: 30km/h

          行为:

            跑:以30km/h速度跑起来

        例子: 劳斯莱斯,法拉利,宾利,迈凯轮,柯尼塞格,兰博基尼,玛莎拉蒂,布加迪

          属性:

            轮子个数:4

            时速: 400km/h

          行为:

            跑:以400km/h速度跑起来

 

        生产车的图纸:车的相关属性(轮子个数,时速)和行为(跑)——>模型——>类

        车:根据图纸中车的不同的属性值和具体的行为—>对象

  5:Xcode创建oc工程

    create a new Xcode project——>Application下的Commmond Line Tool——>填写工程名,type选择Foundation——>选择存储工程路径

  6:c和oc进行比较

 1 /*
 2  文件后缀名:
 3  c: .c
 4  oc: .m
 5  */
 6 
 7 /*
 8  字符串:
 9  c : "字符串"
10  oc: @"字符串"
11  @: oc中基本上所有的关键字都是以@开头
12  // 基本上所有关键字都是以@开头
13  // 下面列举一些常见的关键字,看一眼就行了,不用去翻资料查找它们的含义
14  // @interface、@implementation、@end
15  // @public、@protected、@private、@selector
16  // @try、@catch、@throw、@finally
17  // @protocol、@optional、@required、@class
18  // @property、@synthesize、@dynamic
19  // self、super、id、_cmd、__block、__strong、__weak、
20  //
21  */
22 
23 /*
24  文件包含:
25  c: #include <>, ""
26     不能防止头文件重复包含:
27     #ifndef _HEAD_H
28     #define _HEAD_H
29     
30     #end
31  oc: #import: 自动防止头文件重复包含
32  */
33 
34 
35 /*
36  <Foundation/Foundation.h>
37  Foundation:oc中常用的框架
38  Foundation.h:Foundation:oc框架的主头文件
39  */
40 
41 /*
42  输出函数
43  c:  printf
44  oc: NSLog----->NSLog(@"输出的内容");---->打印对象%@
45  */
46 #import <Foundation/Foundation.h>
47 
48 int main(int argc, const char * argv[]) {
49     @autoreleasepool {//自动释放池---->内存管理
50                     /*
51                      内存管理:
52                      MRC:手动内存管理
53                      ARC:自动内存管理
54                      */
55         // insert code here...
56         NSLog(@"Hello, World!");//作用:将字符串Hello, World!输出
57     }
58     return 0;
59 }

 

  7:Xcode中创建类

    例子:创建一个person类

    实例变量(属性):年龄和姓名

    方法(行为):跑步(不带参数),吃饭(一个参数)和打印person信息(两个参数)

    Person类

Person.h

 1 //oc中创建一个类会出现两个文件
 2 //.h:类的声明
 3 #import <Foundation/Foundation.h>
 4 
 5 /*
 6  @interface Person : NSObject
 7  @interface:类声明的关键字
 8  Person:创建类的名字
 9  :冒号---->继承(冒号的左边子类,冒号的右边父类)
10  NSObject: oc的基类
11  */
12 @interface Person : NSObject {
13     //类中实例变量的声明
14     //oc中的实例变量的名字都是以下划线_开头
15     /*
16      实例变量的访问属性:
17      @public: 共有访问
18      1:类中的方法可以直接访问, 类外的对象可以直接访问
19      2:子类中的方法可以直接访问,子类的对象可以直接访问
20      @protected: 保护访问(默认)
21      1:类中的方法可以直接访问, 类外的对象不可以直接访问
22      2:子类中的方法可以直接访问,子类的对象不可以直接访问
23      @private: 私有访问
24      1:类中的方法可以直接访问, 类外的对象可以直接访问
25      2:子类中的方法不可以直接访问,子类的对象不可以直接访问
26      */
27     int _age;//年龄
28     NSString *_name;//oc中所有的对象都是指针
29 //    char name[20];//姓名
30 }
31 //方法的声明
32 /*
33  类中方法:
34  1: - :对象方法,可以直接访问类中的实例变量,对象来调用该方法
35  2: + :类方法,不能直接访问类中的实例变量(静态方法static), 类名调用该方法
36  */
37 //不带参数的方法
38 //-: 表示该方法是对象方法
39 //(void): 该方法的返回值类型--->在oc中的方法里,所有出现数据类型的地方都放在小括号
40 //run: 方法名
41 - (void)run;//oc
42 //void run(void);//c
43 
44 //带一个参数的方法
45 //-: 表示该方法是对象方法
46 //(void): 该方法的返回值类型--->在oc中的方法里,所有出现数据类型的地方都放在小括号
47 //(NSString *)foodName: 方法的参数, (NSString *)数据类型,foodName参数的名字
48 //eat+:冒号:冒号也是方法名的一部分
49 //: --->冒号的前面是方法名的一部分,冒号的后面是方法参数--->冒号的个数和方法中参数的个数相等的
50 - (void)eat: (NSString *)foodName;
51 
52 //带两个参数的方法
53 //-: 表示该方法是对象方法
54 //(void): 该方法的返回值类型--->在oc中的方法里,所有出现数据类型的地方都放在小括号
55 //(int)age  (NSString *)name:该方法的两个参数,分别是整形和字符串类型
56 //方法名:descPerson:  andName:
57 - (void)descPerson: (int)age andName: (NSString *)name;
58 
59 @end

 

 

 

Person.m

 1 //.m:类的相关实现 
 2 #import "Person.h" 
 3 //@implementation:类实现关键字 
 4 @implementation Person //类方法的实现 
 5 - (void)run
 6 { 
 7     NSLog(@"running..................");
 8 }
 9 - (void)eat:(NSString *)foodName
10 { 
11     NSLog(@"eat : %@", foodName);//输出字符串格式控制%@ 
12 } 
13 - (void)descPerson:(int)age andName:(NSString *)name
14 { 
15     NSLog(@"age is %d name is %@", age, name); 
16 } 
17 @end

 

8:实例变量的setter和getter方法

例子:

要求:创建一个Student类

实例变量:年龄和姓名

方法:实例变量的setter和getter

 

Student类

Student.h

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Student : NSObject{
 4     int _age;//年龄
 5     NSString *_name;//姓名
 6 }
 7 
 8 /*
 9  思考:为什么要有setter和getter方法
10  setter: 外界能够修改当前实例变量的值
11  getter: 外界能够获取当前实例变量的值
12  每一个实例变量都有一个和它对应的setter和getter方法
13  */
14 #pragma mark age的setter和getter方法的声明
15 - (void)setAge: (int)age;//set方法名: set+实例变量的名(首字母大写)
16 - (int)age;//get方法:实例变量的名字
17 
18 #pragma mark name的setter和getter方法声明
19 - (void)setName: (NSString *)name;
20 - (NSString *)name;
21 
22 @end

 

 

 

Student.m

 

 1 #import "Student.h"
 2 
 3 @implementation Student
 4 
 5 #pragma mark age的setter和getter方法的实现
 6 - (void)setAge: (int)age{
 7     _age = age;
 8 }
 9 - (int)age{
10     return _age;
11 }
12 
13 #pragma mark name的setter和getter方法实现
14 - (void)setName: (NSString *)name{
15     _name = name;
16 }
17 - (NSString *)name{
18     return _name;
19 }
20 
21 @end

 

 

9:通过类实例化对象,并且通过对象调用方法

 

 1 #import <Foundation/Foundation.h>
 2 #import "Student.h"//包含student类声明的文件
 3 
 4 int main(int argc, const char * argv[]) {
 5     @autoreleasepool {
 6 #if 0
 7         //实例化student类的对象
 8         //oc中调用方法: [对象名/类名 方法名]
 9         //alloc:类方法
10         //init: 对象方法
11         Student *std = [Student alloc];//alloc: 堆上创建一个student类对象,并把该对象的首地址进行返回//oc中所有对对象的操作都是通过指针来操作的//oc的对象都是指针
12         std = [std init];//init: 对该对象进行初始化
13 #endif
14 #if 0
15         Student *std = [Student new];//new = alloc + init
16 #endif
17         //实例化student类对象
18         Student *std = [[Student alloc] init];//创建对象的方法:先alloc后init
19         //init初始化后实例变量的值默认是0获知nil
20         //_age, _name
21         //调用age的getter方法
22         NSLog(@"age is %d name is %@", [std age], [std name]);
23         //age和name的setter方法
24         [std setAge:18];
25         [std setName:@"chen chao"];
26         NSLog(@"age is %d name is %@", [std age], [std name]);
27     }
28     return 0;
29 }

(未完待续……)

10:init和dealloc

 

11:类方法

 

12:面向对象和面向过程的直观感受

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。