Objective-C第一天课程学习总结
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.OC简介
1. 1
OC语言是在C语言的基础上增加了一层最基本的面向对象的语法
1.2
OC完全兼容C语言
1.3
可以在OC代码嵌入C语言代码,甚至是C++代码
1.4
可以使用OC开发Mac OSX平台和iOS平台的应用程序
2. OC 的语法预览
2.1 关键字
基本上所有的关键字都是以@开头,如下是一些常用的关键字:
@interface、@implementation、@end
@public、@protected、@private、@selector
@try、@catch、@throw、@finally
@protocol、@optional、@required、@class
@property、@synthesize、@dynamic
self、super、id、_cmd、__block、__strong、__weak、
2.2 字符串以@开头
比如@"Hello"是OC中的字符串,而"Hello"则是C语言中的字符串
在OC中输出hello会用下面语句输出NSLog(@"Hello");
在C语言中是用printf输出,还得有转义字符‘\n’来换行,达到上一句的效果
printf("Hello\n");
2.3 其他语法
2.3.1基本数据类型
int,float,double,char,BOOL
2.3.2BOOL
1> BOOL类型的本质
typedef signed char BOOL
2> BOOL类型的变量有2种取值:YES、NO
#define YES(BOOL)1
#define NO(BOOL)0
3> BOOL的输出(当做整数来用)
NSLog(@"%d%d",YES,NO);
2.3.3 NSLog与printf的区别
*NSLog接收OC字符串作为参数,printf接收C语言字符串作为参数
*NSLog输出后会自动换行,printf输出后不会自动换行
*使用NSLog需要#import<Foundation/Foundation.h>
*使用printf需要#include<stdio.h>
2.3.4 #import的作用
*跟#include一样,用来拷贝某个文件的内容
*可以自动防止文件内容被拷贝多次,也就以为着头文件中不用加入下面的预处理指令了
#ifndef _STDIO_H
#define _STDIO_H_
#endif
2.3.5 Foundation框架的作用
*开发OC、iOS、Mac程序必备的框架
*此框架中包含了很多常用的API(应用编程接口)
*架中包含了很多头文件,若想使用整个框架的内容,包含它的主头文件即可 #import <Foundation/Foundation.h>
3.OC 程序的开发过程
OC的开发过程与C语言类似的:
编译:检查语法,生成二进制目标文件
连接:把所有的*.o 文件和库函数连接生成可执行文件
3.1
跟C语言一样,OC程序的入口依然是main函数,只不过写到一个.m文件中。比如这里写到一个main.m文件中(文件名可以是中文)
第一个OC程序
#include <stdio.h>
// OC程序的入口:main函数
int main()
{
printf("第1个OC程序\n");
return 0;
}
第二个OC程序
/*
1.#import的用途:
1> 跟#include一样,拷贝文件的内容
2> 可以自动防止文件的内容被重复拷贝
2.#import <Foundation/NSObjCRuntime.h>
NSObjCRuntime.h中有NSLog函数的声明
3.Foundation框架头文件的路径
1> 右击Xcode.app --> 显示包内容
2> Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/System/Library/Frameworks/Foundation.framework
4.主头文件
1> 主头文件:最主要的头文件,名字一般跟框架名称一样,包含了框架中的所有其他头文件
2> Foundation框架的主头文件名称就是Foundation.h
3> 只需要包含Foundation框架主头文件,就可以使用整个框架的东西
5.运行过程
1> 编写OC源文件:.m、.c
2> 编译:cc -c xxx.m xxx.c
3> 链接:cc xxx.o xxx.o -framework Foundation
(只有用到了Foundation框架才需要加上-framework Foundation)
4> 运行:./a.out
*/
#import <Foundation/Foundation.h>
int main()
{
// NSLog输出内容会自动换行
NSLog(@"第2个OC程序!!!");
return 0;
}
第三个OC程序 :体现了C与OC的混合编程
one.m
#import "two.h"
int main()
{
test();
return 0;
}
two .h<p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;"><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2">void</span> test();</p>
two.m<p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;"></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo; color: rgb(209, 47, 27);"><span style="font-variant-ligatures: no-common-ligatures; color: #78492a">#import </span><Foundation/Foundation.h></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;"></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;"><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2">void</span> test()</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;">{</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;"> NSLog(<span style="font-variant-ligatures: no-common-ligatures; color: #d12f1b">@"</span><span style="font-family: 'Heiti SC Light'; color: rgb(209, 47, 27);">调用了</span><span style="font-variant-ligatures: no-common-ligatures; color: #d12f1b">test</span><span style="font-family: 'Heiti SC Light'; color: rgb(209, 47, 27);">函数</span><span style="font-variant-ligatures: no-common-ligatures; color: #d12f1b">"</span>);</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;">}</p>在执行时,因为用到了Foundation框架,需要加上 -framework Foundation
步骤:
1>编写源文件 .m 和.c文件
2>编译: cc -c *.m *.c
3>连接: cc *.o -framework Foundation
第4个OC程序
/*
BOOL 的使用:
1>BOOL的本质: typedef singed char BOOL
2>BOOL类型变量y只有YES/NO 两种取值,YES(1)NO(0)
*#define YES (BOOL) 1
*#define NO (BOOL) 0
3>Bool 的输出当做整数来用
NSLog(@"%i,%i",YES,NO);
*/
/*********************************
Author : jacy--jacydai@sina.com
Date : Monday 13 , April 2015 am
********************************
*/
#import <Foundation/Foundation.h>
//函数声明
int test();
int main()
{
BOOL b = YES;
BOOL b1 = NO;
BOOL b2 = 1;
BOOL b3 = 0;
NSLog(@"b = %d,b1 = %d,b2 = %d,b3 = %d",b,b1,b2,b3);
NSLog(@"%d",test());
return 0;
}
int test()
{
return YES;
}
主要来测试BOOL的数值输出,这样可以更加深刻的理解BOOL类型
根据程序的执行结果:
1,0
1
可以理解BOOL型变量YES就只代表1,BOOL类型变量NO就只代表0
4. 面向对象和面向过程思想
OC是面向对象的,C是面向过程的。面向对象和面向过程只是解决问题的两种不同思想
4.1 面向对象和面向过程的区别
4.1.1 以用电脑听歌为例子
a) 面向过程
* 打开电脑
* 播放电脑中的歌曲
* 关闭电脑
b) 面向对象(不是相亲的“对象”)
*电脑
*开机
*播放歌曲
* 关机
4.1.2 区别分析
*面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象
*没有开发经验很难感受到它们的区别,两种思想都能达到解决问题的目的,但是解决思路不一样
4.2 现实生活中面向对象的例子
* 想打电话\发短信 à 找手机,不用分析电话要怎样才能拨通
* 去饭店吃饭 à 找服务员,不用分析怎么到厨房炒菜
* 汽车坏了 à 找汽车维修工,不用分析修车的步骤
* 境界:万物皆对象
4.3 常用术语
* 面向过程 ProcedureOriented
* 面向对象 ObjectOriented,简称OO
* 面向对象编程 ObjectOriented Programming,简称OOP
4.4 类和对象的关系
面向对象中有2个非常重要的概念:类和对象
4.4.1如何创建对象
面向对象解决问题的时候必须有对象,那如何创建对象呢?
现实生活的例子:如何创造汽车对象?
1) 需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)
属性:*数、时速
功能(行为):跑
2) 然后再根据图纸上的描述生成汽车
3) 每一辆汽车都是对象,都有自己具体的属性值,都是图纸的实例
4) 图纸是抽象的,房子是具体的。图纸是对房子对象的高度概括
4.4.2 OC中的面相对象
1) OC中的类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类
2) OC利用类来创建对象,对象是类的具体存在
3) 因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象
4.4.3 需要设计哪些类,如何设计类
1) 类的设计,只关心3样东西:
事物名称(类名):人(Person)
属性:身高(height)、年龄(age)
行为(功能):跑(run)、打架(fight)
2) 一般名词都是类
坦克发射3颗炮弹轰掉了2架飞机
小明在公车上牵着一条叼着热狗的狗
3) 拥有相同(或者类似)属性和行为的对象都可以抽像出一个类
愤怒的小鸟游戏界面
植物大战僵尸
新浪微博
4) 类名、属性、行为练习
僵尸、炮弹、车、学生、书本
5) 哪个对象最清楚这个行为,就把这个行为写到哪个对象中去。打开电脑(开机)这个行为应该是属于电脑的。
5. 定义OC的类和创建OC的对象
接下来就在OC中模拟现实生活中的情况,创建一辆车出来。首先要有一个车子类,然后再利用车子类创建车子对象
要描述OC中的类稍微麻烦一点,分2大步骤:类的声明、类的实现(定义)。跟函数类似,函数有分声明和定义
5.1 类的声明
5.1.1 代码编写
定义一个Car类,拥有2个属性:*数、时速,1个行为:跑
类名\属性的命名规则:标示符的规则
类名的命名规范:有意义、驼峰标识、首字母大写
5.1.2 成员变量
@interface的大括号{}中声明的变量:wheels、speed
@interface的大括号和函数的大括号是不一样的
默认会初始化为0
5.1.3 @public
@public可以让Car对象的wheels和speed属性被外界访问
5.1.4 NSObject
加上:NSObject的目的是让Car类具备创建对象的能力
5.2 类的实现
5.3 创建对象
5.3.1代码编写
5.3.2
main函数的代码分析、内存分析(对象在内存中有成员)
[Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址
Car *c = [Carnew];
用一个指针变量c指向内存中的Car对象
设置车子对象的属性
跟用指向结构体的指针访问结构体属性一样,用->
5.4创建多个Car对象
5.5 面向对象封装的好处
更加接近人类的思考方式
只需要关注对象,不需要关注步骤
5.6 对象与函数参数
对象成员变量作为函数参数
指向对象的指针作为函数参数
修改指向指向对象的成员
修改指针的指向
6 类的声明和实现
6.1 @interface和@implementation的分工
@interface就好像暴露在外面的时钟表面
@implementation就好像隐藏在时钟内部的构造实现
6.2 常见错误
只有类的声明,没有类的实现
漏了@end
@interface和@implementation嵌套
两个类的声明嵌套
成员变量没有写在括号里面
方法的声明写在了大括号里面
6.3 语法细节
成员变量不能在{}中进行初始化、不能被直接拿出去访问
方法不能当做函数一样调用
成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)
类的实现可用写在main函数的后面,主要在声明后面就行了
6.4 OC方法和函数的区别
OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
C函数不能访问OC对象的成员
低级错误:方法有声明,但是实现的时候写成了函数
6.5 OC的方法注意
方法只有声明,没有实现(经典错误)
方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)
编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告
6.6 @implementation
没有@interface,只有@implementation,也是能成功定义一个类的
@implementation中不能声明和@interface一样的成员变量
7. 方法
设计一个Caculator计算器类,它拥有计算的功能(行为)
7.1 不带参数的方法
方法调用
7.2 带一个参数的方法
方法调用
7.3 带多个参数的方法
方法调用
7.4 方法名注意
冒号也是方法名的一部分
同一个类中不允许两个对象方法同名
8.匿名对象
8.1 属性访问
8.2 方法调用
<span style="font-family:KaiTi_GB2312;font-size:14px;">[ [Car new] run];
</span>
第一个OC类.m
/*
第一个OC类
类名:Car
属性:*,速度
行为: 跑
*/
/*********************************
Author : jacy--jacydai@sina.com
Date : Monday 13 , April 2015 am
********************************
*/
#import <Foundation/Foundation.h>
//Car 类的声明
@interface Car : NSObject
{
@public
int _wheels;
int _speed;
}
- (void) run;
@end
//Car 类的实现
@implementation Car
- (void) run
{
NSLog(@"%d*的车子以%dkm/h速度跑起来了!",_wheels,_speed);
}
@end
//主函数
int main()
{
Car *c = [Car new];
c->_wheels = 4;
c->_speed = 300;
[c run];
Car *c2 = [Car new];
c2->_wheels = 3;
c2->_speed = 200;
c = c2;
[c2 run];
return 0;
}
第二个OC类.m
/*
第二个OC类
类名:Person
属性:体重,年龄
行为:走路,吃
*/
/*********************************
Author : jacy--jacydai@sina.com
Date : Monday 13 , April 2015 am
********************************
*/
#import <Foundation/Foundation.h>
//类的声明
@interface Person : NSObject
{
@public
double _weight;
int _age;
NSString *_name;
}
- (void) walk;
- (void) eat;
- (void) print;
@end
//类的实现
@implementation Person
- (void) walk
{
//走一次,体重减少0.5kg
_weight -= 0.5;
NSLog(@"年龄%d岁的%@走完一段路后的体重%f",_age,_name,_weight);
}
- (void) eat
{
//吃一次,体重增加1kg
_weight += 1;
NSLog(@"年龄%d岁的%@吃完一次饭后的体重%f",_age,_name,_weight);
}
- (void) print
{
NSLog(@"%@的体重%fkg年龄%d",_name,_weight,_age);
}
@end
//主函数
int main()
{
Person *p = [Person new];
p->_name = @"jack";
p->_weight = 45.5;
p->_age = 23;
[p print];
[p walk];
[p eat];
[p print];
//创建对象p2
Person *p2 = [Person new];
p2->_name = @"Lily";
p2->_weight = 39.5;
p2->_age = 18;
[p2 print];
[p2 walk];
[p2 eat];
[p2 print];
//把p赋给p2
p2 = p;
p2->_name = @"Jelly";
p2->_weight = 40;
[p print];
[p2 print];
return 0;
}
OC类和函数.m
/*
类和函数的一些操作
类:Car
属性:*,速度
行为:跑
*/
/*********************************
Author : jacy--jacydai@sina.com
Date : Monday 13,April 2015 pm
**********************************
*/
#import <Foundation/Foundation.h>
/*
类的有关注意:
1>一个类中可以没有类的声明,这时,成员变量的声明就可以放到类的实现(@implementation.... @end)中
2>在一个类中可以没有一个方法的声明,此时编译器只会给出警告,在实现中必须要有方法的实现
3>一个类中的成员变量可以写在声明中(大多数情况下),也可以写在实现中,成员变量名不能相同(编译会报重复定义错误)
4>成员方法的声明可以有几个同名同类型,实现中不能有同名同类型的方法
5>函数在类中的位置灵活,只要先定义后使用就可以(不可以放到成员变量的大括号中,编译器会报错)
*/
//类的声明
@interface Car : NSObject
{
@public
int _wheels;
int _speed;
//编译器报错
// void test(int w,int s);
// void test2(Car * newCar);
}
- (void) run;
- (void) run;
- (void) run;
void test(int w,int s);
void test2(Car * newCar);
@end
//类的实现
@implementation Car :NSObject
//{
//
// @public
// double _wheels;
// double _speed;
//}
//void test(int w,int s);
//void test2(Car * newCar);
//- (void) run
//{
//
// NSLog(@"%d个*的车以%dkm/h的速度跑起来了", _wheels,_speed);
//}
- (void) run
{
NSLog(@"%d个*的车以%dkm/h的速度跑起来了", _wheels,_speed);
}
@end
//函数声明
//void test(int w,int s);
//void test2(Car * newCar);
int main()
{
void test(int w,int s);
void test2(Car * newCar);
Car *c = [Car new];
c->_wheels = 3;
c->_speed = 30;
[c run];
test(c->_wheels,c->_speed);
[c run];
//调用函数test2
test2(c);
[c run];
return 0;
}
//函数的定义
void test(int w, int s)
{
w = 4;
s = 300;
NSLog(@"调用了test函数");
}
void test2(Car *newCar)
{
NSLog(@"调用了test2函数");
Car *c = [Car new];
c->_wheels = 6;
c->_speed = 350;
newCar = c;
newCar->_wheels = 5;
}
类的合理设计.m
/*
类的合理设计
学生类:Student
属性:性别,生日,体重,最喜欢的颜色,狗
行为:吃,跑,遛狗,喂狗
*/
/**********************************
Author : jacy--jacydai@sina.com
Date : Monday 13,April 2015 pm
**********************************
*/
#import <Foundation/Foundation.h>
//定义枚举类型性别Sex
typedef enum {
//男
SexMan,
//女
SexWoman
} Sex;
//定义结构体类型的日期Date
typedef struct {
//年
int year;
//月
int month;
//日
int day;
} Date;
//定义枚举类型颜色Color
typedef enum {
//蓝色
ColorBule,
//白色
ColorWhite,
//绿色
ColorGreen,
//黑色
ColorBlack,
//黄色
ColorYellow,
//灰色
ColorGrey,
//橘色
ColorOrange,
//粉红色
ColorPink
} Color;
//声明Dog类
@interface Dog : NSObject
{
@public
//狗的体重
double _weight;
//狗的毛色
Color _furColor;
}
//狗吃一次,体重增加0.3kg
- (void) eat;
//狗走一次,体重减少0.2kg
- (void) walk;
@end
//实现Dog类
@implementation Dog
- (void) eat
{
_weight += 0.3;
NSLog(@"狗吃一次,体重为%f",_weight);
}
- (void) walk
{
_weight -= 0.2;
NSLog(@"狗走一次,体重为%f", _weight);
}
@end
//声明学生Student类
@interface Student : NSObject
{
@public
//学生性别
Sex _sex;
//学生生日
Date _birthday;
//学生体重
double _weight;
//学生最喜欢的颜色
Color _favColor;
//学生的狗,应该先声明Dog类
Dog *_dog;
}
//输出学生的信息
- (void) print;
//学生吃一次饭,体重增加0.5kg
- (void) eat;
//学生跑一次步,体重减少0.2kg
- (void) run;
//学生遛狗一次,狗的体重减少0.2kg
- (void) walkDog;
//学生喂狗一次,狗的体重增加0.3kg
- (void) feedDog;
@end
//Student类的实现
@implementation Student
- (void) print
{
NSLog(@"性别:%d,生日:%d-%d-%d,体重:%f,喜欢的颜色:%d",_sex,_birthday.year,_birthday.month,_birthday.day,_weight,_favColor);
}
- (void)eat
{
//吃一次增加0.5kg体重
_weight += 0.5;
NSLog(@"吃完一次饭后的体重为%f",_weight);
}
- (void) run
{
//跑一次,体重减少0.2kg
_weight -= 0.2;
NSLog(@"跑完步后的体重为%f", _weight);
}
- (void) walkDog
{
//先摇摇尾巴
NSLog(@"遛狗,狗先摇摇尾巴!");
[_dog walk];
}
- (void) feedDog
{
//狗先叫两声
NSLog(@"喂狗,狗先叫两声汪汪!");
[_dog eat];
}
@end
//主函数
int main()
{
//创建学生对象
Student *stu = [Student new];
//给学生对象赋初值
stu->_sex = SexMan;
Date date = {1994,11,13};
stu->_birthday = date;
stu->_weight = 49.5;
stu->_favColor = ColorOrange;
//输出学生的数据
[stu print];
//学生吃一次饭
[stu eat];
//学生跑一次步
[stu run];
//输出学生吃完饭,跑完步的数据
NSLog(@"学生吃完饭,跑完步的数据");
[stu print];
//创建Dog对象
Dog *d = [Dog new];
//给狗对象赋初值
d->_weight = 21;
d->_furColor = ColorBlack;
stu->_dog = d;
//学生遛狗
[stu walkDog];
//学生喂狗
[stu feedDog];
return 0;
}
方法声明和实现.m
/*
计算器类:Caculator
方法:
1>返回π的
2>计算两整数的和
3>计算某个整数的平方
*/
/********************************
Author : jacy--jacydai@sina.com
Date : Tuesday 14,April 2015 am
********************************
*/
#import <Foundation/Foundation.h>
//声明类Caculator
@interface Caculator : NSObject
//返回π的值
- (double) pi;
//计算num1和num2的和
- (void) sumWithNum1 : (int) num1 andNum2 : (int) num2;
//计算num的平方
- (void) squareOfNum : (int) num;
@end
//Caculator的实现
@implementation Caculator
- (double) pi
{
return 3.141592;
}
- (void) sumWithNum1 : (int) num1 andNum2 : (int) num2
{
int sum = num1 +num2;
NSLog(@"%d + %d = %d",num1,num2,sum);
}
- (void) squareOfNum : (int) num
{
int square = num * num;
NSLog(@"square of %d is %d",num,square);
}
@end
//主函数
int main()
{
//创建Caculator的对象
Caculator *cacu = [Caculator new];
//调用Caculator对象cacu的方法
//返回π的值
double pi = [cacu pi];
NSLog(@"π的值是%f",pi);
//计算两个数的和
[cacu sumWithNum1 : 12 andNum2 : 34];
//计算整数的平方
[cacu squareOfNum : 15];
return 0;
}
/*
匿名对象
*/
/**********************************
Author : jacy--jacydai@sina.com
Date : Tuesday 14 , April 2015 am
**********************************
*/
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
@public
//速度
int _speed;
}
- (void) run;
@end
//实现Car类
@implementation Car
- (void) run
{
NSLog(@"速度%d的车跑起来了",_speed);
}
@end
//主函数
int main()
{
[Car new]->_speed = 300;
[[Car new] run];
return 0;
}
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------