黑马程序员——Objective-C 第一天课程学习总结

时间:2023-02-07 00:33:44

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

selfsuperid_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

黑马程序员——Objective-C 第一天课程学习总结


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语言类似的:

黑马程序员——Objective-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就好像隐藏在时钟内部的构造实现

 


黑马程序员——Objective-C 第一天课程学习总结

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  不带参数的方法


黑马程序员——Objective-C 第一天课程学习总结

方法调用

黑马程序员——Objective-C 第一天课程学习总结

7.2  带一个参数的方法



方法调用

黑马程序员——Objective-C 第一天课程学习总结

7.3  带多个参数的方法




黑马程序员——Objective-C 第一天课程学习总结

方法调用



黑马程序员——Objective-C 第一天课程学习总结


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;
}


匿名对象.m

/*
匿名对象

*/

/**********************************
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培训、期待与您交流! -------