黑马程序员——Objective-C 第一天课程学习总结
来源:互联网 发布:知乎提问后自己找不到 编辑:程序博客网 时间:2024/04/30 05:38
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语言中的字符串
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) 03>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类 类名: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.comDate : 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; }
/* 类的合理设计 学生类:Student 属性:性别,生日,体重,最喜欢的颜色,狗 行为:吃,跑,遛狗,喂狗 *//********************************** Author : jacy--jacydai@sina.com Date : Monday 13,April 2015 pm ********************************** */#import <Foundation/Foundation.h>//定义枚举类型性别Sextypedef enum { //男 SexMan, //女 SexWoman} Sex;//定义结构体类型的日期Datetypedef struct { //年 int year; //月 int month; //日 int day;} Date;//定义枚举类型颜色Colortypedef 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;}
- 黑马程序员——Objective-C 第一天课程学习总结
- 黑马程序员——Objective-C 第三天课程学习总结
- 黑马程序员——Objective-C 第五天课程学习总结
- 黑马程序员---Objective—C第七天课程学习(Foundation)
- 黑马程序员——Objective-C第六天课程学习
- 黑马程序员——Objective-C 第二天课程学习总结
- 黑马程序员——Objective-C 第四天课程学习总结
- 黑马程序员——自学课程第一天笔记
- 《黑马程序员》高新技术第一天学习总结
- 黑马程序员——前端的第一天总结
- 黑马程序员——Java概述,基础学习第一天总结
- Objective-C学习第一天
- 黑马程序员——WPF学习第一天!!
- 黑马程序员——java基础学习第一天
- 黑马程序员--第一天学习
- 黑马程序员-Java基础学习第一天总结
- 黑马程序员-学习笔记-第一天-C语言
- 黑马程序员-学习笔记-第一天-C语言(正式)-基础知识
- 抽象工厂模式(四):界面皮肤库的抽象工厂模式解决方案
- jsp web.xml文件的作用及基本配置
- 倒置英文字母中单词的字母顺序
- 用java实现小写字母转大写字母
- Android onTouchEvent事件中onTouch方法返回值介绍
- 黑马程序员——Objective-C 第一天课程学习总结
- 2473 Junk-Mail Filter
- zoj 3607 Lazier Salesgirl 暴力 前缀和
- 输入两个整数,将它们按由大到小的顺序输出。要求使用变量的引用
- Java基础第四讲
- string中c_str()、data()、copy(p,n)函数的用法
- 自己理解的C和OC的本质区别
- 继承的相关注意事项
- [bin神带我飞系列]专题一 搜索入门