黑马程序员-IOS基础之OC语法

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


Objective-C

一、基本语法

01、语法概述

OC了解
1> 在C语言的基础上,增加了一层最小的面向对象语法。
2> 完全兼容C语言。
3> 可以在OC代码中混入C语言代码,甚至是C++代码。
4> 可以使用OC开发Mac OS X平台和IOS平台的应用程序。

OC编程语言全球关注热度



有人说:iPhone4是苹果手机的巅峰之作,可以说iPhone4(包括4s)之后再无iPhone,乔布斯够倔,不为市场而随波逐流,坚持自己的信念,最终开创了一个时代。三星之流只是在模仿的基础上加以改进,虽然确实做的好,但这种投机取巧的做法使他注定不会成为经典,而如今的5s、5c、iPhone6、iPhone6 plus也只是向市场妥协的随波逐流的东西。

关键字

1> 基本上所有关键字都是以@开头。
2> 字符串以@开头。
     例:@"Hello"是OC中的字符串,而"Hello"是C中的字符串。
3> 其他语法
     基本数据类型:char,int,float,double,BOOL(YES/NO)。
     nil         :相当于C语言中的NULL,也就是0。
     基本语句    :循环语句(do while,while,for),条件语句。
     注释        ://(单行注释)和/**/(多行注释),和C一样,多行注释不能嵌套
     屏幕输出    :NSLog(@"Hello");NSLog(@"age is %d",25);
4> 基本语法对比


5> 变量定义的对比


02、第一个OC程序 “Hello World”

步骤如下:
1> 打开Xcode

2> 创建项目 OS X->Application->Command Line Tool

3> 选择语言为Objective-C

4> 修改OC源文件 main.m

5> 修改OC源代码 NSLog(@"第一个OC程序!");

6> 运行(Command+R),并查看运行结果


代码如下:

#import <Foundation/NSObjcRuntime.h>

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        //会自动换行
        NSLog(@"第一个OC程序");
    }
    return 0;
}

解读代码含义:

1> #import <Foundation/Foundation.h>,告诉编译器找到并处理名为Foundation.h文件,这是一个系统文件,#import标识将该文件的信息导入到程序中。
框架地址:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/
在C和C++采用#include指令,在本例中也可以采用#include,而#import是#include改进指令,它可以防止头文件重复包含问题。
2> int main(int argc, const char * argv[]),这个方法时程序的入口。参数argc-参数数目,argv-参数值
3> @autoreleasepool{    }这是一个自动释放池,用于回收对象的存储空间。
4> NSLog是Foundation框架提供的Objective-C日志输出函数,与标准C中的printf函数类似,并可以格式化输出
@"Hello,World!";是代表NSString字符串对象,它是Objective-C常用的字符串类。
5> 最后是return 0语句,它表示要终止main的执行,一般情况下0代表正常结束,非0代表异常情况,这些参数最后返回给操作系统,告诉我们程序是否正常运行。这是沿用了C语言的习惯。

import的用途

1> 跟include一样,拷贝文件的内容。
2> 可以自动防止文件的内容被重复拷贝。

终端使用的指令

指令为:cc 02-第一个oc程序.o -framework Foundation

03、Foundation框架头文件的路径

1> 右击Xcode.app->显示包内容
2> Xcode.app/contents/Developer/Platforms/iPhone OS/platform/Developer/SDKs/iPhone 6.0 sdk/system/Library/Frameworks/Foundation.framework

04、主头文件

1> 主头文件:最主要的文件,名字一般跟框架名称一样,包含了框架中的所有其他文件。
2> Foundation框架的主头文件名称就是Foundation.h
3> 只需要包含Foundation框架主头文件,就可以使用整个框架。

05、BOOL

BOOL b = Yes;
BOOL 类型本质:typeof signed char BOOL;
BOOL类型的变量有2种取值:YES、NO
#define YES (BOOL)1
#define NO  (BOOL)0

二、面向对象

<一>、思想

01、面向对象和面向过程

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

面向对象(Object Oriented;简称:OO) 至今还没有统一的概念,我这里把它定义为:按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。

面向对象编程(Object Oriented Programming;简称:OOP)是一种解决软件复用的设计和编程方法。这种方法把软件系统中相近相似的操作逻辑和操作应用数据,状态,以类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。

优点:
大幅度提高软件项目的成功率
较少维护费
提高可移植性和可靠性

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

面向过程
    强调的是功能行为
    关注的是解决问题需要哪些步骤
面向对象
    将功能封装进对象,强调具备了功能的对象
    关注的是解决问题需要哪些对象

02、类和对象

需要设计哪些类,再利用类创建多少个对象

03、如何设计类
1) 类的设计
   事物名称(类名): 人(Person)
   属性: 身高(height)、年龄(age)
   行为: 跑(run)、学习(study)
   一般名词都是类
2) 拥有相同(或者类似)属性和行为的对象都可以抽象一个类

3) 类名的规范
1> 类名的首字母必须是大写
2> 不能有下划线
3> 多个单英文单词,用驼峰标识

<二>、类和对象

01、类的声明和实现
// 完整地写一个函数:函数的声明和定义
// 完整地写一个类:  类的声明和定义
1> 类的声明(包含:属性和行为)
   代码:
@interface Car : NSObject
{
    ...//对象属性(成员变量)放在大括号中,默认会初始化为0
}
@end

2> 类的实现
   代码:
@implementation Car

@end

02、对象的处理
在OC中,想执行一些行为,就写上一个中括号“[]”,[行为执行者 行为名称]

利用类来创建对象
[Car new];//调用的操作,返回地址

OC中只能用指针变量间接操作对象

定义了一个指针变量p,p将来指向的是Car类型的对象
[Car new];//这句话会创建出一个新对象,并且会返回新对象本身,也就是新对象地址
Car *p = [Car new];

注意:OC对象的本质就是结构体,@public可以让外部的指针间接访问对象内部的成员变量

03、对象的行为

1> 方法(也叫行为):方法名,参数,返回值(声明,实现)
2> OC方法中任何数据类型都必须用小括号()扩住
3> 只要是OC对象的方法,就必须以减号“-”开头,类方法就必须以加号“+”开头
4> OC方法中的小括号():扩住数据类型
例:- (void) run;(对象方法的声明)
对象方法的实现:
@implementation Car

- (void) run
{
    NSLog(@"车子跑起来了");
}

@end

给p所指向对象发送一条run消息(消息机制)
[p run];

05、方法和函数的区别

方法:
1> 对象方法都是以减号“-”开头。
2> 对象方法的声明必须写在@interface和@end之间,对象方法的实现必须写在@implementation和@end之间。
3> 对象方法只能由对象来调用。
4> 对象方法归对象所有。
5> 在OC方法中,一个参数对应一个冒号,冒号也是方法名的一部分。

函数:
1> 函数能写在文件中的任意位置(除@interface和@end之间),函数归文件所有
2> 函数调用不依赖于对象。
3> 函数内部不能直接通过成员变量名访问某个对象的成员变量

三、面向对象的三大特性

01、封装 set方法

1、作用:提供一个方法给外界设置成员变量值
2、命名规范:
1> 方法名必须以set开头
2> set后面跟上成员变量的名称,成员变量的首字母必须大写
3> 返回值一定是void
4> 一定要接受一个参数,而且参数类型跟成员变量类型一致。
5> 形参的名称不能跟成员变量一样
如:- (void) setAge:(int)age;


02、封装 get方法

1、作用:返回对象内部的成员变量。
2、命名规范:
1> 肯定有返回值,返回值类型肯定与成员变量类型一致。
2> 方法名跟成员变量名一样。
3> 不需要接受任何参数。

03、封装的好处

把我们内部的成员变量隐藏在里面,把细节隐藏在里面,不让外部知道我们内部的细节,保证我们数据的安全性。

04、成员变量的命名规范

1> 让成员变量和get方法的名称区分开
2> 也可以跟局部变量区分开,一看到下划线开头的变量,一般都是成员变量。

05、弱语法

unrecognized selector sent to instance
不能识别消息发送给某个对象
给person对象发送了一个不能识别的消息:test

06、类方法的基本使用

类方法都是以+开头
如:+ (void) printClassName;

07、类方法与对象方法的区别

对象方法
1> 减号 “-”开头
2> 只能由对象来调用
3> 对象方法中能访问当前对象的成员变量(实例变量)

类方法
1> 加号 “+”开头
2> 只能由类来调用
3> 类方法中不能访问成员变量

使用场合与好处
1> 不依赖于对象,执行效率高
2> 能用类方法尽量使用类方法
3> 场合:当方法内部不需要使用到成员变量时,就可以用类方法可以允许类方法和对象方法同名。

08、self 调用方法

self的用途
1> 概念:谁调用了当前方法,self就代表谁
self出现在对象方法中,self就代表对象
self出现在类方法中,self就代表类
2> 可以利用“self->成员变量名”访问当前对象内部的成员变量
3> [self 方法名]可以调用其他对象方法、类方法

09、继承的基本使用

1、继承的好处
1> 抽取重复代码
2> 建立了类之间的关系
3> 子类可以拥有父类中所有成员变量和方法。

2、注意点
1> 基本上所有类的基类都是:NSObject
2> 父类必须声明在子类的前面
3> 子类不能拥有和父类相同的成员变量
4> 调用某个对象的方法时,优先去当前对象中找,如果找不到,再到父类中找。

缺点:耦合性太强

10、继承 super
super的作用
1> 直接调用父类中的某个方法。
2> super处在对象方法中,那么就会调用父类的对象方法。
super处在类方法中,那么就会调用父类的类方法。
3> 使用场合:子类重复父类的方法时想保留父类的一些行为。

11、多态的基本使用

多态:多种形态,任何OC对象都有可能具有多种形态,没有继承就没有多态
那么,如何在我们的代码中体现多种形态呢?

#import <Foundation/Foundation.h>

//人类
@interface Person : NSObject

- (void)study;

@end

@implementation Person

- (void)study
{
    NSLog(@"Person-学习");
}

@end

//学生类
@interface Student : Person

@end

@implementation Student

- (void)study
{
    NSLog(@"Student-学习");//重写父类的方法
}

@end

int main(int argc,const char * argv[])
{
    //这个也是多态的体现
    NSObject *n = [Animal new];
    
    //多种形态
    Student *s = [Student new];//Student类型

    //多态:父类指针指向子类对象
    Person *p = [Student new];

    [p study];//当我们调用方法的时候,就会动态的检测study方法是否实现,p的真实类型
    return 0;
}

总结:
1、多态的好处:如果函数的参数中使用的是父类类型,可以传入父类、子类对象
2、多态的局限性:父类类型的变量不能用来调用子类的方法
3、没有继承就没有多态
4、代码的体现:父类类型的指针指向子类对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值