第一讲 基本语法 类 对象
A.语法概述
1.Object-C在C语言的基础上延伸而来的,面向对象语言。完全兼容C语言。
3.OC中字符串以@开头,例如@”jack”;OC文件的文件类型是.m
4.语言的注释和C语言的注释相同。
5.OC语言的开发过程是:
6.兼容C语言可以这样写:
//这样写在编译环境中可以完全通过。
#include <stdio.h>
Int main()
{
Printf(“nishiwo”);
Return 0;
}
//OC语言的写法。
#import <Foundation/NSObjCRuntime.h>
Int main()
{
//NSLog输出内容会自动换行
NSLog(@”第二个OC程序!!”);
Return 0;
}
//主函数若想调用其他文件下的函数,在主函数或者要要使用的文件下,必须包含函数的声明,函数的声明一般建立在函数同名的.h文件中。这样在主函数和需要调用的函数中,#import该文件(.h)就可。
//OC语言和C语言在同一个环境中可以混合使用。
#import<Foundation/NSObjCRuntime.h>
#import<stdio.h>
Int main()
{
NSLog(@”OC可以混合写”);
Printf(“C中写”);
}
7.BOOL类型
//OC语言中的布尔类型是YES NO
Int main()
{
BOOL b = YES;
BOOL b1 = NO;
BOOL b2 = 1;
BOOL b3 = 0;
NSLog(@”%i”, b);//b的输出为1
}
//也可以用作函数的返回类型,BOOL的本质是char类型。Typrdefsigned char BOOL
BOOL age();
B.OC设计思想
1.OC是面向对象的,C是面向过程的。面向对象和面向过程只是解决问题的两种不同选择。
面向过程思考的是每个实现的步骤。面向对象思考的是解决问题需要哪些对象。
2.OC中创建对象,必须了解什么是类。类中包含对象的属性和行为。
//类是对相同属性的共同描述和概括,抽象出来的。也就是说要想创建对象,必须先有类。
OC利用类来创建对象,对象是类的具体存在。因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类来创建多少个对象。
3.如何设计类
a.类的设计,只关心3样东西
//事物名称(类名):人(Person)
//属性:身高(height)、年龄(age)
//行为:跑(run)、打架(fight)
b.一般名词都是类。
c.拥有相同(或者类试)属性和行为的对象都可以抽象出来一个类。
4.类的设计
a.类的设计包含:类名、属性、行为。
//类名:
类名的第一个字母必须大写、不能有下划线、多个英文单词用驼峰标示。
b.类的建立包含声明和实现
//类的声明
@interface 类名 :继承其他类(类名)
{
//声明中描述两个属性
}
//在这里放置方法的声明
@end
//因为使用了NSObject这个类,需要包含此类声明的.h文件。#import<Foundation/Foundation .h>
//:NSObject目的是:让Car这个类具备创建对象的能力。
@interface Car :NSObject
{
//声明中描述两个属性
Int wheels;
Int speed;
}
//在这里放置方法的声明
@end
//类的实现
@Implementation 类名
@end
//主函数中
Int main()
{
//在OC中,向执行一些行为,就写上一个中括号[](行为执行者行为名称);
//利用类来创建对象
//执行了Car这个类的new行为来创建新对象
//对象创建出来以后,就拥有了自己的两个成员变量(wheels、speed),并且会初始化为0。
[Car new];
Return 0;
}
//执行完创建对象后,在内存中的分配情况
5.成员变量的直接赋值
//[Car new];创建的对象,返回的是一个指针(对象本身),并且是Car类型的指针,所以类型也是Car类型。
Car *p = [Car new];
//对象创建完以后,在内存中的存储细节是:
//OC对象本身的本质就是结构体
//访问类中的变量,对成员变量(实例变量)赋值。
//默认创建下,成员变量时受保护的。要想访问成员变量,必须加上@public,让成员变量成为公有的。
//声明中描述两个属性
{
@public
Int wheels;
Int speed;
}
p->wheels = 4;
p->speed = 250;
//再次创建第二个对象时,在内存中会有第二个分配的内存块。
Car *p 2= [Car new];
P2->wheels = 4;
P2->speed = 250;
6.对象的行为
a.写行为(方法)的时候,在声明中必须写在大括号的外面,并且在@interface 和@end的里面。
//方法的声明
@interface Car :NSObject
{
//声明中描述两个属性
Int wheels;
Int speed;
}
//在这里放置方法的声明
//方法(行为):方法名、参数、返回值(声明、实现)
//函数声明用 void run();而OC对象的方法是 – (void)run;
//OC中的小括号,必须括住数据类型。
-(void)run;
@end
//方法的实现
@Implementation Car
-(void)run
{
NSLog(@”车子再跑”);
}
@end
//在主函数OC中,向执行一些行为,就写上一个中括号[](行为执行者行为名称);
方法的调用可以这样写:
[p run]; //调用这个函数后,程序会到类的实现中去找这个方法,找到后运行方法。
//类方法的声明、方法的实现
7.成员变量的使用
a.定义一个新的对象,并且存储原来对象的地址,在运用成员变量的时候,将会改变原来成员变量的值
//第二种使用区别,OC里面的对象内存,不可能自动回收的。
//在每个创建的类对象中,分配的内存中都有一个ISA指针,这个指针指向的是类的内存块中的地址,所以创建的类的对象,都是原类的副本,执行的程序都是要运行原类的方法。
8.OC对象和函数的注意点
//对象
a.对象方法都是以-(减号)号开头
b.对象方法的声明必须写在@interface和@end之间
c.对象方法的实现必须写在@implemention和@end之间
d.对象方法只能由对象进行调用
e.对象归类、对象所有
//函数
a.函数能写在文件中的任意位置,函数归文件所有
b.函数调用不依赖于对象
c.函数内部不能直接通过成员变量名访问某个对象的成员变量
//C对象的指针,没有发生改变。所以输出的值还是4和250
9.类的合理设计
a.设计一个学生类
//成员变量:性别、生日、体重、颜色、狗
//方法(行为):吃、跑、遛狗、喂狗
#import<Foundation/Foundation.h>
Typedef enum {
SexMan,
SexWoman
}Sex;
Typedef enum {
ColorBlack,
ColorRed,
ColorGreen
}Color;
Typedef struct {
Int year;
Int month;
Int day
}Date;
@interface Student:NSObject
{
Sex sex;
Date birthday;
Double weight;
Color favColor;
}
-(void)eat;
-(void)run;
@end
@implemention Student
-(void)eat
{
}
-(void)run
{
}
@end
Int main()
{
}
10.类套类的实现(这是真正的面向对象)
//紧接着9中的类设计,加入Dog的类
@interface Dog :NSObject
{
Double weight;
Color curColor;
}
-(void)run;
-(void)eat;
@end
@implemention Dog
-(void)run;
-(void)eat;
@end
//在学生类中加入Dog这个对象。
@interface Student:NSObject
{
Sex sex;
Date birthday;
Double weight;
Color favColor;
//重点学习部分
Dog *dog;
}
Int main()
{
Student *stu =[Student new];
//学生体重
Stu->weight = 50;
//学生性别
Stu->sex = SexMan;
//学生生日
Date d = {2015,02,23};
Stu->birthday = d;
//学生姓名
Stu->name = “jack”;
//dog类的访问
Stu->dog = [Dog new];
[stu liuGou];
Return 0;
}
11.类的声明和实现,带有参数
//类的声明
@interface jishuqi :NSObject
{
}
-(double)pi;
//带有参数的方法,OC方法中,一个参数对应一个冒号
-(int)pingFang:(int)num;
-(int)sumAdd:(int)num1 andNum:(int)num2;
@end
//类的实现
@implementtion jishuqi
-(double)pi;
{
Return 3.14;
}
-(int)pingFang:(int)num
{
Return num * num;
}
-(int)sumAdd:(int)num1 andNum:(int)num2
{
Return num1 + num2;
}
@end
//在主函数中
{
Jishuqi *jsq = [jishuqi new];
Int a = [jsq sumAdd:10 andNum:5];
NSLog(@”%d”, a)
Return 0;
}
12.类的设计练习
//设计一个方法,用来和其他车比较车速,返回车速的差值
@interface Car:NSObject
{
@public
Int speed;
}
-(int)compareSpeedWithOther:(Car *)other;
@end
@implemention Car
-(int)compareSpeedWithOther:(Car *)other
{
//speed这个访问的是当前类中的速度。Other->speed访问的是传递过来的速度
Return speed – other->speed;
}
@end
Int main()
{
Car *c1 = [Car new];
C1->speed = 300;
Car *c2 = [Car new];
C2->speed = 200;
Int a = [c1 compareSpeedWithother:c2];//c1= 300,c2 = 200;
NSLog(@”%d”, a);
Return 0;
}