C的函数
int sum(int x,int y) {
return x+y;
}
OC的方法
-(返回值类型)方法名1:(参数类型) 参数名; //有一个参数的方法
-(返回值类型)方法名1:(参数类型1) 参数名1 and:(参数类型2) 参数名2; //有2个参数方法
//sum---->OC的方法
-(int)sum:(int) x and:(int) y; //方法的声明
//方法的实现
-(int)sum:(int) x and:(int) y {
return x+y;
}
*/
#import<Foundation/Foundation.h>
//写一个计算器的类,类名:Caculator 实例变量:num1,num2 行为:+ - * /
@interface Caculator:NSObject
{
@public
//实例变量书写规范
int _num1; //数据类型 _实例变量名
int _num2;
}
//写一个没有参数的方法
-(int)sum; //没有参数,返回值是int类型
@end
@implementation Caculator
-(int)sum{
//计算_num1+_num2;
return _num1+_num2;
}
@end
int main(int argc,const char * argv[]) {
@autoreleasepool {
Caculator *ca = [Caculator new];
//对象访问实例变量,给实例变量赋值
ca->_num1 = 12;
ca->_num2 = 30;
//调用无参方法
int s = [ca sum];
NSlog(@"s = %d",s);
}
return 0;
}
有参方法声明实现及调用
思考&实现1:
类名:苹果手机(iPhone)
属性:颜色(_color),大小(_size),_cpu
行为:查看本机信息(aboutMyPhone),打电话(call),发短信(sendMessage)
实现该类,并:
1)查看本机信息
2)打电话给10086
3)给10086发短信问联通的客服电话是多少
#import<Foundation/Foundation.h>
//iPhone类的声明
typedef enum color{kColorWhite,kColorBlack,kColorTHJ} iColor;
@interface iPhone:NSObject
{
//类的属性(实例变量,成员变量)
iColor _color; //手机的颜色
float _size; //手机的尺寸
NSString *_cpu; //cpu
}
//类的行为(方法)的声明
//查看手机的信息 实质:把手机的实例变量值打印出来
-(void)aboutMyPhone;
//打电话需要一个参数,参数就是电话号码(字符串)
-(void)callPhone:(NSString *) telNum;
//发短信,给指定号码发送短信,短信的内容可以指定
-(void)sengMessage:(NSString *)telMum andContent:(NSString *) content;
@end
@implementation iPone
//查看手机的信息 实质:把手机的实例变量值打印出来
-(void)aboutMyPhone {
NSLog(@"颜色:%d,尺寸:%.2f,cpu:%@",_color,_size,_cpu);
}
//打电话需要一个参数,参数就是电话号码(字符串)
-(void)callPhone:(NSString *) telNum {
NSLog(@"给%@打电话",telNum);
}
//发短信,给指定号码发送短信,短信的内容可以指定
-(void)sengMessage:(NSString *)telMum andContent:(NString *) content {
NSLog(@"给%@发送短信,短信内容:%@.",telNum,content);
}
@end
int main(int argc,const char * argv[]) {
@autoreleasepool {
//创建对象
iPone *ipone7Plus = [iPone new];
//设定手机的信息
iPone7Plus->_color = kColorTHJ;
iPone7Plus->_cpu = @"A20";
iPone7Plus->_size = 7.9f;
//调用方法
[iPone7Plus aboutMyPhone];
//给凤姐打电话
[ipone7Plus callPhone:@"10086"];
//给10086发短信
[iphone7Plus sendMessage:@"10086" andContent:@"您好,请问联通的客服电话号码是多少?"]
}
return 0;
}
应用:类的创建练习
思考&实现1:
一个人可以吃不同的食物,只要吃东西就会增加体重0.6,如果要是出门遛弯,每走100步,体重减0.2,小于100步忽略不计。
请用面向对象思想实现。
思路:
类名:Person
属性:年龄(_age),体重(_weight)
动作:吃饭(eat)方法,散步(walk)方法
功能:人可以吃各种食物
每次散步,让体重减0.2
#import<Foundation/Foundation.h>
//Person类的声明
@interface Person:NSObject
{
@public
//类的实例变量(属性,成员变量)
NSString *_name; //姓名
int _age; //年龄
float _weight; //体重
}
//定义人的行为
-(void)eat:(NSString *)foodName;
//walk散步
-(void)walk:(int)num;
@end
//Person类的实现
@implementation Person
-(void)eat:(NSString *)foodName {
//吃饭以后,体重要在原来的基础上增加0.6
_weight += 0.6f;
NSLog(@"您吃了%@,当前体重:%.2f",foodName,_weight);
}
//散步
-(void)walk:(int)num {
_weight-=num/100*0.2f;
NSLog(@"您走了%d步,当前体重为:%.2f",num,_weight);
}
@end
int main(int argc,const char *argv[])
@autoreleasepool {
//创建对象
//开空间 初始化 返回空间的首地址
Person *p=[Person new];
//设置对象的实例变量值
p->_name = @"史泰龙";
p->_weight = 180.0f;
p->_age = 18;
[p eat:@"四川麻辣烫"];
[p eat:@"回锅肉"];
[p walk:234];
}
return 0;
}
对象的存储细节
问题1.申请的空间在内存的哪个区?
new的时候申请的空间在内存的堆区(程序动态分配的内存空间)
注意:当new的时候内存的布局是这样的,初始化的时候,如果实例变量是基本数据类型,此时给初始化为0;
如果是OC类型,此时初始化为NULL
2.实例变量又保存在什么地方? 堆区 p(指针变量)存放在栈区
3.对象方法保存在什么地方? 代码区
4.为什么使用[p run];就可以调用方法?如何调用的?
首先找到p对应的堆区的空间,然后找到_isa指针,再找到_isa指向的代码区的空间,然后到该空间中找方法
5.一个类可以创建多个对象?
又创建一个对象p1,不同对象访问的内存空间不相同
Person *p1 = [Person new]
类创建对象,每个对象在内存中都占据一定的存储空间,每个对象都有一份属于自己的单独
的成员变量,所有的对象公用类的成员方法,方法在整个内存中只有一份,类本身在内存中
占据一份存储空间,类的方法存储于此。
#import<Foundation/Foundation.h>
@interface Person:NSObject
{
int _age;
NSString *_name;
}
-(void)run;
@end
@implementation Person
-(void)run {
NSLog(@"人正在跑");
}
@end
int main(int argc,const char *argv[]) {
@autoreleasepool {
Person *p = [Person new];
p->_name = @"柯南";
p->_age = 13;
NSLog(@"姓名:%@,年龄:%d",p->_name,p->_age);
[p run];
//[Person new]做了三件事情
//1)申请内存空间
//2)给实例变量初始化
//3)返回空间的首地址
}
return 0;
}
注意:内存堆区有个指针_isa是用来存放这个对象它所处的类是哪个类