------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
黑马程序员-OC回顾-基础语法
一、objective-C语言简介
Objective-C是面向对象的语言
由Brad Cox基于Smalltalk改进而来
遵从ANSI C标准C语法,同时使用了smalltalk得方法
在运行时可以灵活处理所以事情
Objective-C可以认为是继承了C和Smalltalk优点
Next在1996年被Apple公司接管。Steve Jobs开始在Mac OS X中使用OC。
重新设计了Mac OS来使用Objective-C
使用Objective-C开发了一套Cocoa GUI库
重新发布了Mac OS X(10)
OBjective-C简称OC
二、Objective-C语言发展现状
1、OC学习注意
OC不是一门全新的语言
C语言的基础上增加了一层最小的面向对象语法
OC完全兼容C语言
可以在OC代码中混入C语言代码,甚至是C++代码
可以使用OC开发Mac OS X平台和iOS平台的应用程序
三、OC语言学习路线
1、OC概述
2、OC中的面向对象
3、OC中面向对象特性
4、内存管理
5、OC中类目、协议、延展、委托模型
6、blocks
7、Foundation框架介绍
8、文件操作
9、复制(深浅拷贝)、单例
10、对象归纳
11、KVC、KVO
四、OC的Hello World!
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
}
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语言的习惯。
重点:
1、import和include的区别
include和import都是引入头文件
import引入的头文件,可以防止重复包含
include它是使用预处理指令防止重复包含,如果没有写预处理指令,则无法防止重复包含问题。
2、Foundation/Foundation.h是什么东西
1)头文件
2)头文件位置
3)文件包含了其他的大量的头文件
五、NSLog函数使用方法
NSLog是Cocoa的框架提供的一个方法,定义在NSObjCRuntime.h中
NSLog和printf很像,都是在控制台中输出显示结果。
不同的是,传递进去的格式化字符是NSString的对象,而不是char*这种字符串指针。
用法:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"Hello World!");
NSString *str=@"hello world!";
NSLog(@"%@",str);
NSLog(@"%d,%d",10,20);
}
return 0;
}
注意:
不能使用printf打印OC中的对象(%@占位符不能用),没有结果。
1、NSLog和printf使用的差异
1)、NSLog会自动换行,而printf不会自动换行。
2)、NSLog会自动输出时间等项目信息,printf不会输出调试信息。
3)、NSLog函数的参数是一个NSString对象,printf是一个字符串常量指针。
2、NSLog格式化输出问题
可以格式化输出,但是字符串有特殊的格式:%@。
3、NS前缀
前缀:
在OC应用中的左右类名都必须是全局唯一的。由于很多不同的框架中会有一些相似的功能,所以在名字上可能会有重复,所以苹果官方文档规定类名需要有2-3个字母作为前缀。
类前缀
苹果官方建议两个字母作为前缀的类名是位官方的库和框架准备的,而队友第三方开发者的我们,官方建议使用3个或者更多地字母作为前缀去命名我们的类。
NS来自于NeXTStep的一个软件NeXT Software
NS是为了避免命名冲突而给的前缀
看到NS前缀就知道是Cocoa中的系统类的名称。
六、OC中注释及@符号使用
1、“@”的使用方法
1)@“”
这个符号表示将一个C的字符串转化为OC中的字符串对象NSString。
2)@符号
OC中大部分的关键字都是以@开头的。
2、OC中的注释
1)单行注释 //
2)多行注释
/*
*/
3)文档注释
程序编译是,不对注释做任何处理
注释可以出现在程序的大部分的位置。
七、OC和C差异学习
1、源文件对比
在OC中常见的文件有两种:.h和.m的文件
2、基本语法
1)数据类型
OC数据类型:
基本数据类型、block类型、指针数据类型、特殊类型。
2)变量的定义
(1)C语言的关键字都可以在OC源程序中使用
(2)OC新增的关键字在使用时,注意部分关键字以“@”开头。
3)流程控制语句
OC中没有增加新的流程控制
OC中提供了一种增强型的for循环,可以快速遍历数组、字典等集合。
4)方法定义和声明
OC语言中函数习惯称之为“方法”。
(1)方法声明:
-(int)sum:(int) a and: (int) b;
(2)方法定义
-(int)sum:(int) a and:(int) b
{
return a+b;
}
3、OC新增的数据类型介绍
1)逻辑型
(1)Boolean
Boolean类型指的是用于存储真值和假值的变量,一般用于程序流程控制。
Boolean类型数据允许取值true或false,也可以是0或非0的整数代替true和false。
(2)BOOL
作用:保存逻辑值
取值:YES(真) NO(假)
Boolean和BOOL的底层逻辑是一样的,使用都一样。
八、面向对象编程概念
软件编程就是把我们的思维转变成计算机能够识别的语言的一个过程。
学习的核心是思维。
面向对象是相对于面向过程而言的
面向对象和面向过程都是一种思想
面向对象的概念
按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的方法。
通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。
面向对象编程
是一种解决软件复用的设计和编程方法。
这种方法把软件系统中相近相似的操作逻辑和操作应用数据、状态,以类的形式描述出来,以对象实例的形式在软件中复用,以达到提高软件开发效率的作用。
优点:
1)、大幅度提高软件项目的成功率。
2)、减少维护费
3)、提高可移植性和可靠性
面向对象设计的三个主要特征
封装性、多态性、继承性。
面向对象和面向过程的区别:
面向过程:
强调的是功能行为
关注的是解决问题需要哪些步骤
面向对象:
将功能封装进对象,强调具备了功能的对象
关注的是解决问题需要哪些对象
面向对象是基于面向过程的。
九、类和对象
1、类(class):
类是具有相似内部状态和运动规律的实体的集合(或统称、抽象)。类的概念来自于人们认识自然、认识社会的过程。
两种方法:
1)归纳法:由特殊到一般。
2)演绎法:由一般到特殊。
类的内部状态是指类集合中对象的共同状态;
类的运动规律是值类集合中对象的共同运动规律。
2、对象(object):
即指现实世界中各种各样的实体。
它可以指具体的事物也可以指抽象的事物。
每个对象皆有自己的内部状态和运动规律。
在面向对象概念中我们把对象的内部状态称为属性、运动规律称为方法或事件。
3、消息(Message)
消息是指对象间相互联系和相互作用的方式。
一个消息由5部分组成:发送消息的对象、接受消息的对象、消息传递办法、消息内容(参数)、反馈。
一个类可以实例化多个对象
4、类和对象之间的关系
类(class)
一个类由3部分构成
类的名称:类名
类的属性:一组包含数据的属性
类的方法:允许对属性中包含的数据惊醒操作的方法
对象(object)
是系统中的基本运行实体
对象就是类类型(class type)的变量
定义了一个类,就可以创建这个类的多个对象
一个类就是具有相同类型的对象的抽象
类的构成
人的类设计
事物名称(类名):人(Person)
属性: 身高(height)、年龄(age)
行为(功能):跑(run)
类的抽象
拥有相同(或者类似)属性和行为的对象都可以抽象除一个类
方法:一般名词都是类(名词提炼法)
十、类的声明和实现
1、关于类的几个名词
类
.h:
类的声明文件,用于声明成员变量、方法。
类的声明使用关键字@interface和@end。
.m:
类的实现文件,用于实现.h中声明的方法。
类的实现使用关键字@implementation和@end。
注意:
在.h中只是说明一下方法名、方法的返回值类型、方法接受的参数类型。
在.m中编写方法内部的代码。
方法
方法的声明和实现,都必须以+或者 - 开头
- 表示类方法(静态方法)
- 表示对象方法(动态方法)
在.h中声明的所有方法的作用域都是pbulic类型,不能更改。
成员变量(实例变量\属性)
成员变量的常用作用域有3种:
@public 全局都可以访问
@protected 只能在类内部和子类中访问
@private 只能在类内部访问
2、声明一个类
1)声明类使用关键字@interface 和 @end
2)声明类,我们通常放到.h头文件中
格式
@interface 类名:父类名
{
定义类的属性
}
类的行为
@end
#import <Foundation/Foundation.h>
//声明一个学生的类
@interface Student : NSObject
{
int age;
char sex;
NSString *name;
}
//类的行为
@end
3、实现一个类
1)实现一个类使用关键字@implementation和@end
2)实现一个类通常放到.m的文件中
3)实现类主要是对方法的具体实现
格式:
@implementation 类名
{
类的行为的具体是实现
}
@end
@implementation Student
//行为的具体描述
@end
十一、创建一个对象并访问成员变量
1、创建一个对象
我们用类的方式告诉了计算机我们需要一个什么样的对象,之后我们要再程序中使用这个对象,就必须先创建一个对象
格式:
Car *car = 【Car new】;
这条语句的作用:
理解方式1:
1)、定义了一个Car类型的指针变量
2)、指针变量指向新申请的内存空间
理解方式2:(比较常用)
用Car类实例化了一个实例对象,对象的名称是car。
注意:
【Car new】;
在内存中做了三件事:
1、开辟存储空间
2、初始化成员变量(写在类声明大括号中的属性就叫做成员变量,也叫实例变量)
3、返回新申请空间的首地址(要用Car类型的指针接收地址)
2、访问对象的成员变量
首先声明属性位:@public
然后通过 对象->对象成员 的方式操作对象中的成员。
/*
1、创建类的对象
2、访问对象的成员变量
*/
#import <Foundation/Foundation.h>
//一个学生类
//类的声明
@interface Student : NSObject
{
@public;
int age;
char sex;
NSString *name;
}
@end
//类的实现
@implementation Student
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *stu1=[Student new];
stu1->age=18;
stu1->sex='B';
stu1->name=@"张无忌";
NSLog(@"年龄:%d,性别:%c,姓名:%@",stu1->age,stu1->sex,stu1->name);
}
return 0;
}
十二、无参方法声明实现及调用
OC中方法分为:对象方法和类方法。
1、对象方法
1) 对象方法以 - 开头
2) 对象方法只能有对象来调用
3) 对象方法中可以访问当前对象的成员变量
4) 调用格式 [对象名 对象方法名]
2、类方法
1) 类方法以 + 开头
2)类方法只能有类来调用
3)类方法中不能访问实例(成员)变量,因为类方法有类来调用,并咩有创建存储空间来存储类中的成员变量。
4)调用格式: [类名 类方法名];
5)类方法的好处和使用场合:
不依赖于对象,执行效果更高;
能用类方法解决的问题,尽量使用类方法;
场合:当方法内部不需要使用到成员变量时,可以改为类方法。
不带参数的方法
1、声明:
- (double) pi;
方法类型 返回值类型 方法名;
2、方法的调用
使用对象调用方法就是OC中的消息机制
OC语言中采用特定的语言调用类或者实例(对象)的方法称为发送消息或方法调用。
格式:
[类名或者对象名 方法名];
对于对象方法就是:[对象名 方法名];
//
// main.m
// 14-无参方法声明实现及调用
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
@public;
int age;
char sex;
NSString *name;
}
//对象的行为
-(void)study; //无参方法的声明
-(void)play;
@end
//类的实现
@implementation Student
//方法的具体实现
-(void)study{
NSLog(@"好好学习,天天向上!");//无参方法的实现
}
-(void)play{
NSLog(@"该学学,该玩玩!");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *stu1=[Student new];
[stu1 study];//无参方法的调用
[stu1 play];
}
return 0;
}
十三、有参方法声明和实现
1、有参方法的声明和是实现
1)声明:
注意:冒号也是方法名的一部分。
C和OC的对比
C的函数
int sum (int x,int y){
return x+y;
}
OC的方法
1)有一个参数的方法:
-(返回值类型)方法名:(参数类型)参数名;
2)有两个参数的方法:
-(返回值类型)方法名:(参数类型1)参数名1 and:(参数类型2)参数名2;
sum的OC方法的声明:
-(int)sum:(int) x and:(int) y;
2、方法的实现
-(int)sum:(int) x and:(int) y{
return x+y;
}
有参方法的使用注意:
方法的类型: (-)对象方法
方法的返回值: int类型
方法的参数: x和y
参数的类型: 第一个int,第二个int类型
方法名(重点): sum: and:
冒号是方法名的一部分
注意:方法的实现中@implementation后是没有大括号的。{ }
思考&实现
/*
水浒卡登记系统
类名:水浒108将(Hero_108)
属性:名字(_name),外号(_nickName),排名(_num)职务(_post),武器(_weapon),大招(_skill)。
行为:查看人物属性(aboutHero),对某个人放大招(attack)
*/
#import <Foundation/Foundation.h>
@interface Hero_108:NSObject
{
@public
NSString *_name;
NSString *_nickName;
int _num;
NSString *_post;
NSString *_weapon;
NSString *_skill;
}
-(void)aboutHero;
-(void)attack:(NSString *) enemy;
@end
@implementation Hero_108
-(void)aboutHero{
NSLog(@"姓名:%@,外号:%@,排名:%d,职务:%@,武器:%@,大招:%@",_name,_nickName,_num,_post,_weapon,_skill);
}
-(void)attack:(NSString *) enemy{
NSLog(@"%@用%@干掉了%@",_name,_skill,enemy);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Hero_108 *yanQin=[Hero_108 new];
yanQin->_name=@"燕青";
yanQin->_nickName=@"浪子";
yanQin->_num=36;
yanQin->_post=@"步军统领兼谍报队长";
yanQin->_weapon=@"飞燕弩";
yanQin->_skill=@"夺命扑";
[yanQin aboutHero];
[yanQin attack:@"高俅"];
}
return 0;
}
运行结果:
2015-10-19 10:08:16.293 水浒卡登记[559:31588] 姓名:燕青,外号:浪子,排名:36,职务:步军统领兼谍报队长,武器:飞燕弩,大招:夺命扑
2015-10-19 10:08:16.293 水浒卡登记[559:31588] 燕青用夺命扑干掉了高俅
Program ended with exit code: 0