黑马程序员——Objective-C 第一天课程学习总结

来源:互联网 发布:知乎提问后自己找不到 编辑:程序博客网 时间:2024/04/30 05:38

Objective-C第一天课程学习总结


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1.OC简介

1. 1

     OC语言是在C语言的基础上增加了一层最基本的面向对象的语法
1.2 

     OC完全兼容C语言
1.3 

    可以在OC代码嵌入C语言代码,甚至是C++代码
1.4  

    可以使用OC开发Mac OSX平台和iOS平台的应用程序

2. OC 的语法预览

2.1 关键字

   基本上所有的关键字都是以@开头,如下是一些常用的关键字:

@interface@implementation@end

@public@protected@private@selector

@try@catch@throw@finally 

@protocol@optional@required@class

@property@synthesize@dynamic

selfsuperid_cmd__block__strong__weak

2.2 字符串以@开头

比如@"Hello"是OC中的字符串,而"Hello"则是C语言中的字符串

在OC中输出hello会用下面语句输出

NSLog(@"Hello");

在C语言中是用printf输出,还得有转义字符‘\n’来换行,达到上一句的效果

printf("Hello\n");


2.3 其他语法

2.3.1基本数据类型

 int,float,double,char,BOOL



2.3.2BOOL

  1>  BOOL类型的本质

       typedef signed char BOOL    

   2> BOOL类型的变量有2种取值:YES、NO

        #define YES(BOOL)1

        #define NO(BOOL)0    

  3>  BOOL的输出(当做整数来用)

       NSLog(@"%d%d",YES,NO);

2.3.3   NSLog与printf的区别

      *NSLog接收OC字符串作为参数,printf接收C语言字符串作为参数

      *NSLog输出后会自动换行,printf输出后不会自动换行

      *使用NSLog需要#import<Foundation/Foundation.h>

      *使用printf需要#include<stdio.h>

 2.3.4   #import的作用

   *跟#include一样,用来拷贝某个文件的内容

   *可以自动防止文件内容被拷贝多次,也就以为着头文件中不用加入下面的预处理指令了

    #ifndef _STDIO_H

    #define _STDIO_H_

    #endif

2.3.5  Foundation框架的作用

        *开发OC、iOS、Mac程序必备的框架

     *此框架中包含了很多常用的API(应用编程接口)

     *架中包含了很多头文件,若想使用整个框架的内容,包含它的主头文件即可 #import  <Foundation/Foundation.h>

 

3.OC 程序的开发过程

OC的开发过程与C语言类似的:


编译:检查语法,生成二进制目标文件

连接:把所有的*.o 文件和库函数连接生成可执行文件

3.1

   跟C语言一样,OC程序的入口依然是main函数,只不过写到一个.m文件中。比如这里写到一个main.m文件中(文件名可以是中文)

第一个OC程序

#include <stdio.h>// OC程序的入口:main函数int main(){    printf("第1个OC程序\n");    return 0;}

第二个OC程序

/* 1.#import的用途: 1> 跟#include一样,拷贝文件的内容 2> 可以自动防止文件的内容被重复拷贝  2.#import <Foundation/NSObjCRuntime.h>    NSObjCRuntime.h中有NSLog函数的声明  3.Foundation框架头文件的路径 1> 右击Xcode.app --> 显示包内容 2> Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/System/Library/Frameworks/Foundation.framework  4.主头文件 1> 主头文件:最主要的头文件,名字一般跟框架名称一样,包含了框架中的所有其他头文件 2> Foundation框架的主头文件名称就是Foundation.h 3> 只需要包含Foundation框架主头文件,就可以使用整个框架的东西   5.运行过程 1> 编写OC源文件:.m、.c 2> 编译:cc -c xxx.m xxx.c 3> 链接:cc xxx.o xxx.o -framework Foundation   (只有用到了Foundation框架才需要加上-framework Foundation) 4> 运行:./a.out */#import <Foundation/Foundation.h>int main(){    // NSLog输出内容会自动换行    NSLog(@"第2个OC程序!!!");        return 0;}


第三个OC程序 :体现了C与OC的混合编程

one.m#import "two.h"int main(){    test();    return 0;}
two .h<p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;"><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2">void</span> test();</p>
two.m<p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;"></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo; color: rgb(209, 47, 27);"><span style="font-variant-ligatures: no-common-ligatures; color: #78492a">#import </span><Foundation/Foundation.h></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;"></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;"><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2">void</span> test()</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;">{</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;">    NSLog(<span style="font-variant-ligatures: no-common-ligatures; color: #d12f1b">@"</span><span style="font-family: 'Heiti SC Light'; color: rgb(209, 47, 27);">调用了</span><span style="font-variant-ligatures: no-common-ligatures; color: #d12f1b">test</span><span style="font-family: 'Heiti SC Light'; color: rgb(209, 47, 27);">函数</span><span style="font-variant-ligatures: no-common-ligatures; color: #d12f1b">"</span>);</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;">}</p>
   在执行时,因为用到了Foundation框架,需要加上 -framework Foundation

   步骤:

   1>编写源文件 .m 和.c文件

   2>编译: cc -c  *.m  *.c

  3>连接: cc *.o  -framework Foundation

第4个OC程序

/* BOOL 的使用: 1>BOOL的本质: typedef singed char BOOL 2>BOOL类型变量y只有YES/NO 两种取值,YES(1)NO(0)   *#define YES (BOOL) 1   *#define NO (BOOL) 03>Bool 的输出当做整数来用  NSLog(@"%i,%i",YES,NO);*//********************************* Author : jacy--jacydai@sina.com Date : Monday 13 , April 2015 am ******************************** */#import <Foundation/Foundation.h>//函数声明int test();int main(){    BOOL b = YES;    BOOL b1 = NO;    BOOL b2 = 1;    BOOL b3 = 0;    NSLog(@"b = %d,b1 = %d,b2 = %d,b3 = %d",b,b1,b2,b3);        NSLog(@"%d",test());    return 0;}int test(){    return YES;}


主要来测试BOOL的数值输出,这样可以更加深刻的理解BOOL类型

根据程序的执行结果:

 1,0

1

可以理解BOOL型变量YES就只代表1,BOOL类型变量NO就只代表0

4.  面向对象和面向过程思想

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

4.1  面向对象和面向过程的区别

4.1.1    以用电脑听歌为例子

   a) 面向过程

        *   打开电脑

        *   播放电脑中的歌曲

        *  关闭电脑

 

    b)    面向对象(不是相亲的“对象”)

          *电脑

          *开机

          *播放歌曲

          * 关机 

4.1.2 区别分析

    *面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象

    *没有开发经验很难感受到它们的区别,两种思想都能达到解决问题的目的,但是解决思路不一样

 4.2 现实生活中面向对象的例子

     *  想打电话\发短信 à 找手机,不用分析电话要怎样才能拨通

     *  去饭店吃饭 à 找服务员,不用分析怎么到厨房炒菜

     *  汽车坏了 à 找汽车维修工,不用分析修车的步骤

     *   境界:万物皆对象

4.3 常用术语

      *   面向过程 ProcedureOriented

      *   面向对象 ObjectOriented,简称OO

      *   面向对象编程 ObjectOriented Programming,简称OOP

 4.4 类和对象的关系

       面向对象中有2个非常重要的概念:类和对象

4.4.1如何创建对象

     面向对象解决问题的时候必须有对象,那如何创建对象呢?

     现实生活的例子:如何创造汽车对象?

    1) 需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)

       属性:轮子数、时速

       功能(行为):跑

    2) 然后再根据图纸上的描述生成汽车

    3) 每一辆汽车都是对象,都有自己具体的属性值,都是图纸的实例

    4) 图纸是抽象的,房子是具体的。图纸是对房子对象的高度概括

 4.4.2  OC中的面相对象

      1) OC中的相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类

      2)   OC利用类来创建对象,对象是类的具体存在

      3)   因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象

 4.4.3   需要设计哪些类,如何设计类

   1) 类的设计,只关心3样东西:

    事物名称(类名):人(Person)

    属性:身高(height)、年龄(age)

    行为(功能):跑(run)、打架(fight)

 

    2) 一般名词都是类

     坦克发射3颗炮弹轰掉了2架飞机

    小明在公车上牵着一条叼着热狗的狗

 

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

      愤怒的小鸟游戏界面

 

      植物大战僵尸

 

      新浪微博

 

   4)   类名、属性、行为练习

      僵尸、炮弹、车、学生、书本

 

  5)   哪个对象最清楚这个行为,就把这个行为写到哪个对象中去。打开电脑(开机)这个行为应该是属于电脑的。


5.  定义OC的类和创建OC的对象

  接下来就在OC中模拟现实生活中的情况,创建一辆车出来。首先要有一个车子类,然后再利用车子类创建车子对象

  要描述OC中的类稍微麻烦一点,分2大步骤:类的声明类的实现(定义)。跟函数类似,函数有分声明和定义

5.1  类的声明

5.1.1 代码编写

     定义一个Car类,拥有2个属性:轮子数、时速,1个行为:跑

     类名\属性的命名规则:标示符的规则

     类名的命名规范:有意义、驼峰标识、首字母大写

 5.1.2   成员变量

     @interface的大括号{}中声明的变量:wheels、speed

     @interface的大括号和函数的大括号是不一样的

     默认会初始化为0

 

5.1.3 @public

     @public可以让Car对象的wheels和speed属性被外界访问

 

5.1.4  NSObject

加上:NSObject的目的是让Car类具备创建对象的能力

 5.2 类的实现

 5.3  创建对象

5.3.1代码编写

5.3.2 

     main函数的代码分析、内存分析(对象在内存中有成员)

      [Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址

      Car *c = [Carnew];

      用一个指针变量c指向内存中的Car对象   

      设置车子对象的属性

      跟用指向结构体的指针访问结构体属性一样,用->


 5.4创建多个Car对象


 5.5 面向对象封装的好处

      更加接近人类的思考方式

     只需要关注对象,不需要关注步骤

 5.6 对象与函数参数

      对象成员变量作为函数参数

      指向对象的指针作为函数参数

     修改指向指向对象的成员

     修改指针的指向


6   类的声明和实现

6.1   @interface和@implementation的分工

  @interface就好像暴露在外面的时钟表面

  @implementation就好像隐藏在时钟内部的构造实现

 


6.2  常见错误

     只有类的声明,没有类的实现

     漏了@end

     @interface和@implementation嵌套

     两个类的声明嵌套

     成员变量没有写在括号里面

     方法的声明写在了大括号里面

 6.3 语法细节

     成员变量不能在{}中进行初始化、不能被直接拿出去访问

     方法不能当做函数一样调用

     成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)

     类的实现可用写在main函数的后面,主要在声明后面就行了

6.4 OC方法和函数的区别

     OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在

     C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有

     C函数不能访问OC对象的成员

     低级错误:方法有声明,但是实现的时候写成了函数

 6.5 OC的方法注意

     方法只有声明,没有实现(经典错误)

     方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)

     编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告

6.6 @implementation

   没有@interface,只有@implementation,也是能成功定义一个类的

@implementation中不能声明和@interface一样的成员变量


7. 方法

    设计一个Caculator计算器类,它拥有计算的功能(行为)

7.1  不带参数的方法


方法调用

7.2  带一个参数的方法



方法调用


7.3  带多个参数的方法




方法调用




7.4 方法名注意

      冒号也是方法名的一部分

    同一个类中不允许两个对象方法同名

 

8.匿名对象

8.1  属性访问


8.2 方法调用

<span style="font-family:KaiTi_GB2312;font-size:14px;">[ [Car new]  run];</span>


第一个OC类.m
/* 第一个OC类  类名:Car   属性:轮子,速度  行为: 跑  *//********************************* Author : jacy--jacydai@sina.com Date : Monday 13 , April 2015 am ******************************** */#import <Foundation/Foundation.h>//Car 类的声明@interface Car : NSObject{    @public    int _wheels;    int _speed;}- (void) run;@end//Car 类的实现@implementation Car- (void) run{    NSLog(@"%d轮子的车子以%dkm/h速度跑起来了!",_wheels,_speed);}@end//主函数int main(){    Car *c = [Car new];    c->_wheels = 4;    c->_speed = 300;        [c run];        Car *c2 = [Car new];    c2->_wheels = 3;    c2->_speed = 200;    c = c2;    [c2 run];    return 0;}



 第二个OC类.m

/* 第二个OC类 类名:Person 属性:体重,年龄 行为:走路,吃 *//********************************* Author : jacy--jacydai@sina.com Date : Monday 13 , April 2015 am ******************************** */#import <Foundation/Foundation.h>//类的声明@interface Person : NSObject{    @public    double _weight;    int _age;    NSString *_name;}- (void) walk;- (void) eat;- (void) print;@end//类的实现@implementation Person- (void) walk{    //走一次,体重减少0.5kg    _weight -= 0.5;    NSLog(@"年龄%d岁的%@走完一段路后的体重%f",_age,_name,_weight);}- (void) eat{    //吃一次,体重增加1kg    _weight += 1;    NSLog(@"年龄%d岁的%@吃完一次饭后的体重%f",_age,_name,_weight);}- (void) print{    NSLog(@"%@的体重%fkg年龄%d",_name,_weight,_age);}@end//主函数int main(){    Person *p = [Person new];    p->_name = @"jack";    p->_weight = 45.5;    p->_age = 23;    [p print];    [p walk];    [p eat];    [p print];        //创建对象p2    Person *p2 = [Person new];    p2->_name = @"Lily";    p2->_weight = 39.5;    p2->_age = 18;    [p2 print];    [p2 walk];    [p2 eat];    [p2 print];        //把p赋给p2    p2 = p;    p2->_name = @"Jelly";    p2->_weight = 40;        [p print];        [p2 print];        return 0;}


OC类和函数.m

/* 类和函数的一些操作 类:Car  属性:轮子,速度 行为:跑 *//*********************************Author : jacy--jacydai@sina.comDate : Monday 13,April 2015 pm ********************************** */#import <Foundation/Foundation.h>/* 类的有关注意: 1>一个类中可以没有类的声明,这时,成员变量的声明就可以放到类的实现(@implementation.... @end)中 2>在一个类中可以没有一个方法的声明,此时编译器只会给出警告,在实现中必须要有方法的实现 3>一个类中的成员变量可以写在声明中(大多数情况下),也可以写在实现中,成员变量名不能相同(编译会报重复定义错误) 4>成员方法的声明可以有几个同名同类型,实现中不能有同名同类型的方法 5>函数在类中的位置灵活,只要先定义后使用就可以(不可以放到成员变量的大括号中,编译器会报错) *///类的声明@interface Car : NSObject{    @public    int _wheels;    int _speed;    //编译器报错//    void test(int w,int s);//    void test2(Car * newCar);}- (void) run;- (void) run;- (void) run;void test(int w,int s);void test2(Car * newCar);@end//类的实现@implementation Car :NSObject//{////    @public//    double _wheels;//    double _speed;//}//void test(int w,int s);//void test2(Car * newCar);//- (void) run//{//    //    NSLog(@"%d个轮子的车以%dkm/h的速度跑起来了", _wheels,_speed);//}- (void) run{     NSLog(@"%d个轮子的车以%dkm/h的速度跑起来了", _wheels,_speed);}@end//函数声明//void test(int w,int s);//void test2(Car * newCar);int main(){    void test(int w,int s);    void test2(Car * newCar);    Car *c = [Car new];    c->_wheels = 3;    c->_speed = 30;    [c run];        test(c->_wheels,c->_speed);    [c run];    //调用函数test2    test2(c);    [c run];        return 0;}//函数的定义void test(int w, int s){    w = 4;    s = 300;    NSLog(@"调用了test函数");}void test2(Car *newCar){    NSLog(@"调用了test2函数");    Car *c = [Car new];    c->_wheels = 6;    c->_speed = 350;    newCar = c;    newCar->_wheels = 5;    }


类的合理设计.m

/* 类的合理设计 学生类:Student 属性:性别,生日,体重,最喜欢的颜色,狗 行为:吃,跑,遛狗,喂狗   *//********************************** Author : jacy--jacydai@sina.com Date : Monday 13,April 2015 pm ********************************** */#import <Foundation/Foundation.h>//定义枚举类型性别Sextypedef enum {    //男    SexMan,    //女    SexWoman} Sex;//定义结构体类型的日期Datetypedef struct {    //年    int year;    //月    int month;    //日    int day;} Date;//定义枚举类型颜色Colortypedef enum {    //蓝色    ColorBule,    //白色    ColorWhite,   //绿色    ColorGreen,    //黑色    ColorBlack,    //黄色    ColorYellow,    //灰色    ColorGrey,    //橘色    ColorOrange,    //粉红色    ColorPink} Color;//声明Dog类@interface Dog : NSObject{    @public    //狗的体重    double _weight;    //狗的毛色    Color _furColor;    }//狗吃一次,体重增加0.3kg- (void) eat;//狗走一次,体重减少0.2kg- (void) walk;@end//实现Dog类@implementation Dog- (void) eat{    _weight += 0.3;    NSLog(@"狗吃一次,体重为%f",_weight);}- (void) walk{        _weight -= 0.2;    NSLog(@"狗走一次,体重为%f", _weight);}@end//声明学生Student类@interface Student : NSObject{    @public    //学生性别    Sex _sex;    //学生生日    Date _birthday;    //学生体重    double _weight;    //学生最喜欢的颜色    Color _favColor;    //学生的狗,应该先声明Dog类    Dog *_dog;}//输出学生的信息- (void) print;//学生吃一次饭,体重增加0.5kg- (void) eat;//学生跑一次步,体重减少0.2kg- (void) run;//学生遛狗一次,狗的体重减少0.2kg- (void) walkDog;//学生喂狗一次,狗的体重增加0.3kg- (void) feedDog;@end//Student类的实现@implementation Student- (void) print{    NSLog(@"性别:%d,生日:%d-%d-%d,体重:%f,喜欢的颜色:%d",_sex,_birthday.year,_birthday.month,_birthday.day,_weight,_favColor);}- (void)eat{    //吃一次增加0.5kg体重    _weight += 0.5;    NSLog(@"吃完一次饭后的体重为%f",_weight);}- (void) run{    //跑一次,体重减少0.2kg    _weight -= 0.2;    NSLog(@"跑完步后的体重为%f", _weight);}- (void) walkDog{    //先摇摇尾巴    NSLog(@"遛狗,狗先摇摇尾巴!");    [_dog walk];}- (void) feedDog{    //狗先叫两声    NSLog(@"喂狗,狗先叫两声汪汪!");    [_dog eat];}@end//主函数int main(){    //创建学生对象    Student *stu = [Student new];    //给学生对象赋初值    stu->_sex = SexMan;    Date date = {1994,11,13};    stu->_birthday = date;    stu->_weight = 49.5;    stu->_favColor = ColorOrange;        //输出学生的数据    [stu print];    //学生吃一次饭    [stu eat];    //学生跑一次步    [stu run];    //输出学生吃完饭,跑完步的数据    NSLog(@"学生吃完饭,跑完步的数据");    [stu print];        //创建Dog对象    Dog *d = [Dog new];    //给狗对象赋初值    d->_weight = 21;    d->_furColor = ColorBlack;    stu->_dog = d;        //学生遛狗    [stu walkDog];    //学生喂狗    [stu feedDog];        return 0;}


方法声明和实现.m

/* 计算器类:Caculator 方法: 1>返回π的 2>计算两整数的和 3>计算某个整数的平方  *//******************************** Author : jacy--jacydai@sina.com Date : Tuesday 14,April 2015 am ******************************** */#import <Foundation/Foundation.h>//声明类Caculator@interface Caculator : NSObject//返回π的值- (double) pi;//计算num1和num2的和- (void) sumWithNum1 : (int) num1 andNum2 : (int) num2;//计算num的平方- (void) squareOfNum : (int) num;@end//Caculator的实现@implementation Caculator- (double) pi{    return 3.141592;}- (void) sumWithNum1 : (int) num1 andNum2 : (int) num2{    int sum = num1 +num2;    NSLog(@"%d + %d = %d",num1,num2,sum);}- (void) squareOfNum : (int) num{    int square = num * num;    NSLog(@"square of %d is %d",num,square);}@end//主函数int main(){    //创建Caculator的对象    Caculator *cacu = [Caculator new];    //调用Caculator对象cacu的方法        //返回π的值    double  pi = [cacu pi];    NSLog(@"π的值是%f",pi);    //计算两个数的和    [cacu sumWithNum1 : 12 andNum2 : 34];    //计算整数的平方    [cacu squareOfNum : 15];            return 0;}


匿名对象.m

/* 匿名对象  *//********************************** Author : jacy--jacydai@sina.com Date : Tuesday 14 , April 2015 am ********************************** */#import <Foundation/Foundation.h>@interface Car : NSObject{    @public    //速度    int _speed;}- (void) run;@end//实现Car类@implementation Car- (void) run{    NSLog(@"速度%d的车跑起来了",_speed);}@end//主函数int main(){    [Car new]->_speed = 300;    [[Car new] run];    return 0;}


 

 


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------



0 0
原创粉丝点击