-----------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> 其它语法:
基本数据类型 | Char、int、float、double、BOOL(YES/BNO) |
Nil | 相当于NULL,也就是0 |
基本语句 | 循环语句(do while、while for)、条件语句(if、if else、switch) |
注释 | // 和/*...*/ |
屏幕输出 |
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类型:(1:YES/ 0:NO)
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、NSLog与pritf区别:
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;或:-(int)sum: (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()
{
类名 *P = [类名 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]。
//利用类来创建对象
/*
* 例如:成员变量直接赋值:
*/
//定义一个指针变量P,P将来指向的是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; 或:-(int)sum: (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、一定要接收一个参数,且参数类型与成员变量类型一致、形参的名称不能跟成员变量名;(例:- (void)setAge : (int) newAge;)
2> get方法:返回对象内部的成员变量;
① 命名规范:方法名跟成员变量名一致、肯定有返回值,返回值类型肯定与成员变量类型一致、不需接收任何参数;(例: - (int) age;)
② 只读成员变量(只允许外界访问,不允许修改):使用get方法返回变量值;
3> 成员变量的命名规范(一定要以下划线_开头):
① 好处:让成员变量和get方法的名称区分开、可跟局部变量区分开,一看到下划线开头的变量,一般都是成员变量;
2、弱应用:OC是在程序运行过程中才会检测对象有没有实现相应的方法;
3、类方法(以+开头,例:+(void)printClassName):(对象方法:以-开头,例:-(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> 注意点:基本上所有类的根类为NSObject,NSProxy不是继承NSObject;
4> 使用继承注意点:
① 不允许子类和父类拥有相同名称的成员变量;
② 父类必须声明在子类前面;
③ 调用某个方法时,优先去当前对象中找,若找不到,然后去父类找;
④ 重写:子类重新实现父类中的某个方法,覆盖父类以前的做法;
5> 缺点:耦合性太强(两个类关联性太强了);
6> 继承的使用场合:
① 当两个类拥有相同属性和方法的时候,就可将相同的东西抽取到一个父类中;
② 当A类拥有B类中的部分属性和方法时,可考虑让B类继承A类;
6、组合:(A类中:B *_b; A类拥有B类组合)
1> 继承与组合的区别:继承--> XX是XXX;组合:XX类拥有XXX类;
2> A类中:B *_b; A类拥有B类组合;
7、Super关键字使用(与继承相关):
1> super作用:
① 直接调用父类中的某个方法;
② super处在对象方法中,那么就会调用父类的对象方法;
Super处在类方法中,那么就会调用父类的类方法;
2> 使用场景:子类重写父类的方法时想保留父类的一些行为;
3>
8、多态(多种形态):
1> 调用方法时会检测对象的真实形象;
2> 好处:若函数/方法参数中使用的是父类类型,可传入父类、子类对象;
3> 多态局限性:
① 父类类型的变量,不能用来调用子类的方法,必须强制转为子类类型变量后,才能直接调用子类特有的方法;
4> 没有继承就没有多态;
5> 代码体现:父类指针指向子类对象;