黑马程序员_ Objective-c 概述及面向对象与三大特性

      -----------android培训java培训java学习型技术博客、期待与您交流!------------ 

(一)、语法概述

1、 oc介绍:(.m文件)

1> c语言的基础上,增加了一层小的面向对象语法;

2> 完全兼容c语言;

3> 可在oc代码中混入c代码,甚至c++代码;

4> 可使用oc开发mac os x平台和ios平台的应用程序;

2、Oc语法预览

1> 关键字:基本上所有关键字都以@开头;

2> 不以@开头的关键字:self super_cmd_block_strong_weak;

3> 字符串都以@开头;

4> 其它语法:

 基本数据类型  CharintfloatdoubleBOOL(YES/BNO)
 Nil  相当于NULL,也就是0
 基本语句  循环语句(do whilewhile for)、条件语句(ifif elseswitch
 注释  // /*...*/
 屏幕输出  

3、Oc程序的开发过程

1> NSLog输出内容会自动换行;

2> 引入头文件:#import <**.h>;import的用途:跟#include一样,拷贝文件内容,可自佛那个防止文件的内容被重复拷贝】;

3> 编译oc文件:cc **.o -framework Foundation

4> QuartzCore动画框架;

5> Foundation框架头文件路径:右击Xcode.app--显示包内容;Xcode.app/Contents/Developer/Platforms/iphoneOS.platform/Developer/SDKs/iphoneOS6.0.sdk/System/Library/Frameworks/Foundation.framework;

6> 主头文件:

。主头文件:最主要的头文件,名字一般跟框架名一样,包含了框架中的所有其它头文件;

Foundation框架的主头文件名为Foundation.h;

。只需包含Foundation框架主头文件,就可试用整个框架的东西;

6> 运行过程:

。编写oc源程序:.m.c;

。编译:cc -c xxx.m xxx.c;

。链接:cc xxx.o xxx.o -framework Foundation;【仅用到了框架才使用-framework

。运行:./a.out

4、BOOL类型:(1YES/ 0NO)

1> BOOL /YES/NO全为大写;

2> BOOL类型的本质:typedef signed char BOOL;

3> BOOL取值:YES/NO;#define YES (BOOL) 1 #define NO (BOOL) 0

4> BOOL输出(当整数用):NSLog(@”%d %i”,YES,NO);

5、NSLogpritf区别:

1>  NSLog是接收oc字符串作为参数,pritf是接收c字符串作为参数;

2> NSLog输出后会自动换行,pritf输出后不会自动换行;

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

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

(二)、面向对象:(oc是面向对象,c是面向过程【面向过程:关注步骤】)

1、常用术语:

1> 面向过程:Procedure Oriented;

2> 面向对象:Object Oriented,简称 OO

3> 面向对象编程:Object Oriented Programming,简称 OOP;

2、类与对象:(面向对象中2个重要概念:类与对象)

1> oc中的面向对象:

Oc中的类相当于图纸,用了描述一类事物,想创建对象,必须先有类;

Oc利用类来创建对象,对象是类的具体存在;

。面向对象解决问题应该是先考虑需要设计哪些类,再利用类来创建多少对象;

2>如何设计类:(拥有相同或类似属性和行为的对象都可抽象出一个类)

。事物名(类名);Person;【首字母大写,且无下划线,驼峰标识多个英文名】

。属性(成员变量/实例变量);height/age;

。行为(功能/方法):run/fight;

3> 类的声明:

成员变量

方法的声明

例:

@interface 类名 NSObject 

@public

成员变量;//不允许初始化,不允许变量1和变量2重复,不随便将成员变量加入satic;

 

方法的声明:-void)方法名(有冒号的或有多个参数的则冒号或andNUM1:也是方法名的一部分)//OC方法中,一个参数对应一个冒号,例如:-int) he : (int) num;或:-intsum: (int)num1:(int)num2===>-(int)si,WithNum1:(int)num1 andNum2:(int)num2;

@end

4> 类的实现:

@implementation 类名

//实现@interface中声明的方法

-void)方法名

{

NSLog(@成员变量为%d方法的实现speed);

}

@end

5> main函数的实现:

int main()

{

类名 *= [类名 new]

P->成员变量=20

[指针变量名P  方法名]

return 0;

}

3、类的声明和实现

1> 类的声明:(声明对象的属性、行为)

#import <Foundation/Foundation.h>

/*

类的声明

*/

//NSObject目的是:让Car这个类具备创建对象的能力

@interface 类名 :NSObject 

//@public:可让外部的指针间接访问对象内部的成员变量

//成员变量://不允许初始化,不允许变量1和变量2重复,不随便将成员变量加入satic;

@public

 成员变量;//声明对象的属性(成员/实例变量,默认会初始化为0):(如:int speed;

/*

对象的行为

*/

//方法(行为):方法名、参数、返回值(声明/实现)

//只要是OC对象的方法,必须以减号-开头

//OC方法中任何数据类型都必须用小括号()括住

//OC方法中的小括号:括住数据类型

-void) run;

 

@end

2> 类的定义/实现:

/*

类的实现:用来实现@inteface中声明的方法

*/

@implementation 类名

//方法的实现

-void) run()

NSLog(@速度 为%d的车子类的run方法实现了!speed);

 }

@end

3> main函数:

int main(){

//OC中,想执行一些行为,就写上一个中括号[行为执行者 行为名称],如[Car new]

//利用类来创建对象

 

/*

例如:成员变量直接赋值:

*/

//定义一个指针变量PP将来指向的是Car类型的对象;

//[Car new]每次都会创建出一个新对象,且会返回新对象本身(新对象地址);

Car * P = [Car new];

//P所指向对象的speed属性赋值;

P->speed = 250;

 

//P所指向对象发送一条run消息

[P run];

 

NSLog(@Car 速度为%d,P->speed);

 

return 0;

}

4、 对象简单内存分析: 使用类创建对象前([类名 new]),会将类加载进内存(仅第一次 使用时加载,且仅加载一次)

5、方法和函数的区别:

1> 对象方法都以减号 -

2> 对象方法的声明必须卸载@interface@end之间;

   对象方法的实现必须在@implementation@end之间;

3> 对象方法只能由对象来调用;

4> 对象方法归类/对象所有;

5> 函数能写在文件中的任意位置(@interface @end之间),函数归文件所有;

6> 函数调用不依赖于对象;

7> 函数内部不能直接通过成员变量来访问某个对象的成员变量;

6、类的合理设计:

7、方法的声明和实现:

1> 方法的声明:-void)方法名(有冒号的或有多个参数的则冒号或andNUM1:也是方 法名的一部分)//OC方法中,一个参数对应一个冒号,例如:-int) he : (int) num; 或:-intsum: (int)num1:(int)num2===>-(int)si,WithNum1:(int)num1  andNum2:(int)num2;

8、匿名对象:易造成内存泄漏;

1> Car *c=[Car new]; c->speed =300;==> [Car new]->speed=300===>[[Car new] run];

2> 

9、学习方法:Xcode-->Help-->doumenct API--->眼睛,查看API文档;

10、API文档安装:

1> 直接放到Xcode中:/Applications/Xcode.app/Contents/Developer/Documentation/DocSets;

2> 放到硬盘的某个路径:/Users/用户名/Library/Developer/Shared/Documentation/DocSets;

11、 

(三)、面向对象三大特性(成员的封装、继承、多态

1、封装:

1> set方法(成员变量去掉@public):提供一个方法给外界设置成员变量值,可在方法中对参数进行相应过滤;

① 命名规范:方法名必须以set开头、set后面跟上成员变量名称,成员变量的首字母必须大写、返回值必须为void、一定要接收一个参数,且参数类型与成员变量类型一致、形参的名称不能跟成员变量名;(例:voidsetAge : (int) newAge;

2> get方法:返回对象内部的成员变量;

① 命名规范:方法名跟成员变量名一致、肯定有返回值,返回值类型肯定与成员变量类型一致、不需接收任何参数;(例: int) age;

② 只读成员变量(只允许外界访问,不允许修改):使用get方法返回变量值;

3> 成员变量的命名规范(一定要以下划线_开头):

① 好处:让成员变量和get方法的名称区分开、可跟局部变量区分开,一看到下划线开头的变量,一般都是成员变量;

2、弱应用:OC是在程序运行过程中才会检测对象有没有实现相应的方法;

3、类方法(+开头,例:+voidprintClassName)(对象方法:以-开头,例:-(void) Car);

1> 类方法调用时,可不使用指针New,,就可直接调用方法(例:[类名 printClassName]);

2> 对象方法与类方法

对象方法:以减号-开头、只能由对象类调用、对象方法中能访问当前对象的成员变量(实例变量);

类方法:以加号+开头、只能由类(名)调用、类方法中不能访问成员变量(实例变量)、可允许类方法名与对象方法名一致;

3> 类方法的好处:

不依赖于对象,执行效率高;

能用类方法尽量用类名;

使用场合:当方法内部不需要使用成员变量时,就可改为类方法;

4> ctrl+c退出死循环;

4、Self使用:(self是个指针,代表当前对象)

1> 概念:谁调用了当前方法,self就代表谁(如:self出现在对象方法中,self就代表对象;self出现在类方法中,self就代表类;);

2> 可利用self->成员变量名,访问当前对象内部的成员变量;

3> 调用方法:调用其它类方法/对象方法,如:[self 方法名]

4> 

5、继承(代表类间的关系,父类/超类:supprtclass

1> @interface Car Person,其中:表示Car类继承了Person父类,相当于拥有了Person类中所有的成员变量及方法;

2> 继承的好处:抽取重复代码,建立了类之间的关系,子类可拥有父类的所有成员变量及方法;

3> 注意点:基本上所有类的根类为NSObjectNSProxy不是继承NSObject

4> 使用继承注意点:

① 不允许子类和父类拥有相同名称的成员变量;

② 父类必须声明在子类前面;

③ 调用某个方法时,优先去当前对象中找,若找不到,然后去父类找;

④ 重写:子类重新实现父类中的某个方法,覆盖父类以前的做法;

5> 缺点:耦合性太强(两个类关联性太强了);

6> 继承的使用场合:

① 当两个类拥有相同属性和方法的时候,就可将相同的东西抽取到一个父类中;

② 当A类拥有B类中的部分属性和方法时,可考虑让B类继承A类;

6、组合:(A类中:B *_b; A类拥有B类组合)

1> 继承与组合的区别:继承--> XXXXX;组合:XX类拥有XXX;

2> A类中:B *_b; A类拥有B类组合;

7、Super关键字使用(与继承相关)

1> super作用:

① 直接调用父类中的某个方法;

② super处在对象方法中,那么就会调用父类的对象方法;

   Super处在类方法中,那么就会调用父类的类方法;

2> 使用场景:子类重写父类的方法时想保留父类的一些行为;

3> 

8、多态(多种形态):

1> 调用方法时会检测对象的真实形象;

2> 好处:若函数/方法参数中使用的是父类类型,可传入父类、子类对象;

3> 多态局限性:

① 父类类型的变量,不能用来调用子类的方法,必须强制转为子类类型变量后,才能直接调用子类特有的方法;

4> 没有继承就没有多态;

5> 代码体现:父类指针指向子类对象;