#import <Foundation/Foundation.h>
//1.类的声明。行为
//: NSObject目的是让Car这个类具备创建对象的能力//相当于java中的继承Object
@interface Car : NSObject
{//用来声明对象的属性(实例变量、成员变量,默认初始化为0)
//@public可以让外部的指针间接访问对象内部的成员变量,//相当于java中的public
@public
int wheels;
int speed;
}
//方法(行为):方法名.参数。返回值(声明。实现)
//只要是OC对象的方法,必须以减号 - 开头
//OC方法中任何数据类型都必须使用小括号()扩起来
-(void)run;
@end
//2.类的实现@interface 中声明的方法
//用来实现@interface中声明的方法
@implementation Car
//方法的实现(说清楚方法里面有什么代码)
-(void)run
{
NSLog(@"车子跑起来了");
}
@end
int main()
{
//在OC中,想执行一些行为,就写上一个中括号[行为执行者 行为名称]
//利用类来创建对象
// 执行了Car这个类new行为创建新对象
//[Car new]每次都会创建一新对象,并且返回这个对象的本身(新对象的地址)
Car *p=[Car new];
Car *p2=[Car new];
p2->wheels=4;//修改p所指向对象属性的值,属性必须使用@public来进行修饰
p2->speed=240;
[p2 run];//给P所指向的对象发送一条Run消息
NSLog(@"车子有%d个轮子,时速:%dkm/h", p2->wheels,p2->speed);
return 0;
}
2.面向对象的好处
更加接近人类的思考方式,只需要关注对象,不需要关注步骤
3.常见错误
- 只有类的声明,没有类的实现
- 漏掉了@end
- @interface和@implementation嵌套
- 两个类的声明嵌套
- 成员变量没有写在括号里面
- 方法声明写在了大括号里面
4.语法细节
- 成员变量不能在{}中进行初始化,不能直接拿出去访问
- 方法不能当作函数一样调用
- 成员变量\方法不能用static等关键字修饰,不能和C语言混在一起
- 类的实现可以写在main函数后面,主要在声明后面就行了
5.OC方法和函数的区别
- OC的方法只能声明在@interface和@end之间的{}之外,只能实现在@implementation和@end之间,也就是说OC方法不能独立于类存在
- C语言函数不属于类,和类没联系,C函数只归定义函数的文件所有
- C函数不能访问OC对象的成员
- 低级错误:方法有声明,但实现的时候写成了函数
6.OC方法注意
- 方法只有声明,没有是实现(经典错误)
- 方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法,只有@implementation也可以成功的定义一个类)
- 编译的时候访问没有的成员变量直接报错
编译链接OC的源文件成为一个可执行文件的命令
cc 文件全名 -framework Foundation
7.类带有参数的方法示例:
/*
计算器类
方法:
1> 返回 π
2> 计算某个整数的平方
3> 计算两个整数的和
*/
#import<Foundation/Foundation.h>
@interface jisuanqi : NSObject
-(double)pi; //返回pi
//在OC方法中一盒冒号对应一个OC参数,用来区分实现时候的多个参数
-(int)pingFang : (int)num;
//方法名是:sumWithNum1:andNum2:
-(int)sumWithNum1:(int)num1 andNum2:(int)num2;
@end
@implementation jisuanqi
-(double)pi{//不带参数的方法
return 3.14;
}
-(int)pingFang:(int)num
{
return num*num;
}
//描述更贴切
-(int)sumWithNum1:(int)num1 andNum2:(int)num2
{
return num1+num2;
}
@end
int main()
{
jisuanqi *jsq=[jisuanqi new];
double a=[jsq pi];
int b=[jsq pingFang:10];
int c=[jsq sumWithNum1:20 andNum2:30];
NSLog(@"pi方法的返回值是%f",a);
NSLog(@"pingFang:方法的返回值是%d",b);
NSLog(@"sumWithNum1:andNum2:方法的返回值是%d",c);
}
7.1不带参数的方法
//方法声明
-(double)pi;
//方法实现
-(void)pi
{
return 3.14;
}