zoukankan      html  css  js  c++  java
  • 黑马程序员_ 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> 代码体现:父类指针指向子类对象;

  • 相关阅读:
    设计模式之六大设计原则学习笔记
    java多线程学习笔记
    mac上安装mongodb数据库教程
    在mac下使用终端命令通过ssh协议连接远程linux系统,代替windows的putty
    从request对象中获取请求json格式的参数
    @Conditional注释
    lambda 根据实体类的拼音排序
    PHP一行代码获取时间戳
    PHP导出生成Excel文件
    Mysql merge引擎介绍
  • 原文地址:https://www.cnblogs.com/yaochao/p/4033639.html
Copyright © 2011-2022 走看看