//创建对象
//[Person new];
//做了三件事
//分配空间,初始化,返回空间的首地址
Person *p = [Person new];
p->_age = 24;
p->_name = @"陈自超";
NSLog(@"你叫%@,年龄%d岁!", p->_name, p->_age);
//调用方法
//[Person new];
//做了三件事
//分配空间,初始化,返回空间的首地址
Person *p = [Person new];
p->_age = 24;
p->_name = @"陈自超";
NSLog(@"你叫%@,年龄%d岁!", p->_name, p->_age);
//调用方法
[p
run];
1、申请的空间在内存的哪个区?
//new的时候申请的空间在内存的堆区(程序动态分配的内存空间)
//当new的时候内存的布局是这样的
//实例变量初始化:基本数据类型:初始化为0
OC字符串类型:NULL
2、实例变量又保存在什么地方?
//实例变量在堆区
//p 存放在栈区
3、对象方法保存在什么地方?
//对象方法在代码区
4、为什么使用[p
run];就可以调用方法了?如何调用?
//首先找到p对象的堆区的空间,然后找到_isa指针,再找到_isa指针指向的代码区的空间,然后在该空间去找方法
5、一个类可以实例化多个对象
//代码区的类只加载一次
//不同的对象在内存中的地址是不同,所以各个成员变量的地址也不相同
一个对象系统自动初始化
两个对象自己赋值
#pragma mark指令
功能:对代码分组,方便代码查询和导航
#pragma mark - :出现一条分割线
对象和方法之间的关系:1、对象作为方法的参数
2、对象作为方法返回值
/*
设计一个狗类
1)属性
*颜色
*速度(单位m/s)
*性别
*体重(单位kg)
2)行为
*吃:每吃一次体重增加0.5,输出吃完后的体重
*吠(叫):输出所有的属性
*跑:每跑一次,体重减少0.5,输出速度和跑完后的体重
*比较颜色:跟别的狗比较颜色。如果一样,两个值做减法得零,返回NO,不一样,做减法得非零值,返回YES
*比较速度:跟别的狗比较速度,返回速度差(自己的速度-其他狗的速度)
人类
1》属性
*姓名
*狗(养了一条狗)
2》行为
*喂狗:每喂狗依次,购会执行吃的行为
*遛狗:每遛狗依次,狗会执行跑得行为
*/
#import <Foundation/Foundation.h>
//定义狗的颜色的枚举
typedef enum {kColorWhite, kColorYellow, kColorHua, kColorBlack} Color;
//定义狗的性别枚举
typedef enum {kSexGong, kSexMu, kSexYao} Sex;
//声明狗类
#pragma mark 狗类的声明
@interface Dog : NSObject
{
@public
//属性
Color _color;
float _speed;
Sex _sex;
float _weight;
}
//方法
-(void) eat:(NSString *) foodName;//吃
-(void) bark;//叫
-(void) run;//跑
-(BOOL) isCompareColorWithOther:(Dog *) Dog;//比较颜色,传一个狗对象
-(float) isCompareSpeedWithOther:(Dog *) Dog;//比较速度
@end
//方法实现
#pragma mark 狗类的实现
@implementation Dog
//方法具体实现
-(void) eat:(NSString *) foodName {
_weight += 0.5f;
NSLog(@"狗正在吃%@,狗的体重:%.2f(kg)", foodName, _weight);
}//吃
-(void) bark {
NSLog(@"狗的颜色:%d,狗的速度:%.2f(m/s),狗的性别:%d,狗的体重:%.2f(kg)", _color, _speed, _sex, _weight);
}//叫
-(void) run {
_weight -= 0.5;
NSLog(@"狗的速度:%.2f(m/s),狗的体重:%.2f(kg)", _speed, _weight);
}//跑
-(BOOL) isCompareColorWithOther:(Dog *)Dog {
//当前狗的颜色 另外一条狗的颜色
if(_color == Dog->_color) {
return YES;
} else {
return NO;
}
}//比较颜色
-(float) isCompareSpeedWithOther:(Dog *)Dog {
return fabsf(_speed - Dog->_speed);
}//比较速度
@end
#pragma mark -
//声明人类
#pragma mark 人类的声明
@interface Person : NSObject
{
@public
//属性
NSString *_name;
Dog *_dog;
}
//方法的声明
//喂狗
-(void) feedDog:(NSString *) foodName;
//遛狗
-(void) liuDog;
@end
#pragma mark 人类的实现
@implementation Person
//喂狗
-(void) feedDog:(NSString *) foodName {
//_dog 狗吃东西
[_dog eat:foodName];
}
//遛狗
-(void) liuDog {
//_dog 狗跑起来
[_dog run];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建狗对象1
Dog *p1 = [Dog new];
p1->_color = kColorHua;
p1->_speed = 15.2f;
p1->_sex = kSexYao;
p1->_weight = 45.5f;
// //狗对象2
// Dog *p2 = [Dog new];
// p2->_color = kColorBlack;
// p2->_speed = 20.5f;
// p2->_sex = kSexGong;
// p2->_weight = 40.5f;
// [p1 eat:@"牛肉汤"];
// [p1 bark];
// [p1 run];
//
// //返回值1相同
// BOOL isSameColor = [p1 isCompareColorWithOther:p2];
// NSLog(@"isSameColor = %d", isSameColor);
//
// float cha = [p1 isCompareSpeedWithOther:p2];
// NSLog(@"两只狗速度相差%.2f(m/s)", cha);
//创建人对象
Person *m = [Person new];
m->_name = @"陈自超";
//先给人一条狗,不然_dog为null
m->_dog = p1;
//方法调用,人喂狗
[m feedDog:@"狗骨头"];
//人遛狗
[m liuDog];
}
return 0;
设计一个狗类
1)属性
*颜色
*速度(单位m/s)
*性别
*体重(单位kg)
2)行为
*吃:每吃一次体重增加0.5,输出吃完后的体重
*吠(叫):输出所有的属性
*跑:每跑一次,体重减少0.5,输出速度和跑完后的体重
*比较颜色:跟别的狗比较颜色。如果一样,两个值做减法得零,返回NO,不一样,做减法得非零值,返回YES
*比较速度:跟别的狗比较速度,返回速度差(自己的速度-其他狗的速度)
人类
1》属性
*姓名
*狗(养了一条狗)
2》行为
*喂狗:每喂狗依次,购会执行吃的行为
*遛狗:每遛狗依次,狗会执行跑得行为
*/
#import <Foundation/Foundation.h>
//定义狗的颜色的枚举
typedef enum {kColorWhite, kColorYellow, kColorHua, kColorBlack} Color;
//定义狗的性别枚举
typedef enum {kSexGong, kSexMu, kSexYao} Sex;
//声明狗类
#pragma mark 狗类的声明
@interface Dog : NSObject
{
@public
//属性
Color _color;
float _speed;
Sex _sex;
float _weight;
}
//方法
-(void) eat:(NSString *) foodName;//吃
-(void) bark;//叫
-(void) run;//跑
-(BOOL) isCompareColorWithOther:(Dog *) Dog;//比较颜色,传一个狗对象
-(float) isCompareSpeedWithOther:(Dog *) Dog;//比较速度
@end
//方法实现
#pragma mark 狗类的实现
@implementation Dog
//方法具体实现
-(void) eat:(NSString *) foodName {
_weight += 0.5f;
NSLog(@"狗正在吃%@,狗的体重:%.2f(kg)", foodName, _weight);
}//吃
-(void) bark {
NSLog(@"狗的颜色:%d,狗的速度:%.2f(m/s),狗的性别:%d,狗的体重:%.2f(kg)", _color, _speed, _sex, _weight);
}//叫
-(void) run {
_weight -= 0.5;
NSLog(@"狗的速度:%.2f(m/s),狗的体重:%.2f(kg)", _speed, _weight);
}//跑
-(BOOL) isCompareColorWithOther:(Dog *)Dog {
//当前狗的颜色 另外一条狗的颜色
if(_color == Dog->_color) {
return YES;
} else {
return NO;
}
}//比较颜色
-(float) isCompareSpeedWithOther:(Dog *)Dog {
return fabsf(_speed - Dog->_speed);
}//比较速度
@end
#pragma mark -
//声明人类
#pragma mark 人类的声明
@interface Person : NSObject
{
@public
//属性
NSString *_name;
Dog *_dog;
}
//方法的声明
//喂狗
-(void) feedDog:(NSString *) foodName;
//遛狗
-(void) liuDog;
@end
#pragma mark 人类的实现
@implementation Person
//喂狗
-(void) feedDog:(NSString *) foodName {
//_dog 狗吃东西
[_dog eat:foodName];
}
//遛狗
-(void) liuDog {
//_dog 狗跑起来
[_dog run];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建狗对象1
Dog *p1 = [Dog new];
p1->_color = kColorHua;
p1->_speed = 15.2f;
p1->_sex = kSexYao;
p1->_weight = 45.5f;
// //狗对象2
// Dog *p2 = [Dog new];
// p2->_color = kColorBlack;
// p2->_speed = 20.5f;
// p2->_sex = kSexGong;
// p2->_weight = 40.5f;
// [p1 eat:@"牛肉汤"];
// [p1 bark];
// [p1 run];
//
// //返回值1相同
// BOOL isSameColor = [p1 isCompareColorWithOther:p2];
// NSLog(@"isSameColor = %d", isSameColor);
//
// float cha = [p1 isCompareSpeedWithOther:p2];
// NSLog(@"两只狗速度相差%.2f(m/s)", cha);
//创建人对象
Person *m = [Person new];
m->_name = @"陈自超";
//先给人一条狗,不然_dog为null
m->_dog = p1;
//方法调用,人喂狗
[m feedDog:@"狗骨头"];
//人遛狗
[m liuDog];
}
return 0;
}
对象作为方法的参数连续传递
/*
实现功能:士兵开枪,枪射击子弹
枪类
名称:Gun
属性:型号(_size),子弹个数(_bulletCount)
行为:射击
人类
名称:Soldier
属性:姓名(_name),等级(_level),血量(_life)
行为:跑 蹲 开枪 跳
子弹类
名称:Bullet
属性:子弹个数,型号(_model)
*/
#import <Foundation/Foundation.h>
//子弹连续传递了两次
#pragma mark 子弹类的声明
@interface Bullet : NSObject
{
@public
NSString *_size;
int _bulletCount;
}
@end
#pragma mark 子弹类的实现
@implementation Bullet
@end
#pragma mark 枪类的声明
@interface Gun : NSObject
{
@public
//属性
NSString *_size;
// int _bulletCount; //普通
}
-(void) shoot:(Bullet *) bullet;
@end
#pragma mark 枪类的实现
@implementation Gun
-(void) shoot:(Bullet *) bullet {
//每射击一次,子弹个数-1
if (bullet->_bulletCount > 0) {
bullet->_bulletCount --;
NSLog(@"%@正在突突的射击。。。,剩余子弹:%d", _size, bullet->_bulletCount);
} else {
NSLog(@"蠢驴,没子弹了!");
}
}
@end
#pragma mark -
//#pragma mark 士兵类的声明-普通
//@interface Soldier : NSObject
//{
// @public
// NSString *_name;
// int _life;
// int _level;
//
//}
//-(void) fireByGun:(Gun *) gun;
//@end
//#pragma mark 士兵类的实现-普通
//@implementation Soldier
//-(void) fireByGun:(Gun *) gun {
// //让枪射击
// [gun shoot];
//}
//@end
#pragma mark 士兵类声明-高级
@interface Soldier : NSObject
{
@public
NSString *_name;
int _life;
int _level;
}
-(void) fireByGun:(Gun *) gun andBullet:(Bullet *) bullet;
@end
#pragma mark 士兵类实现-高级
@implementation Soldier
//开枪,传了子弹和弹夹
-(void) fireByGun:(Gun *) gun andBullet:(Bullet *) bullet {
//让枪装上子弹,然后射击
[gun shoot:bullet];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建枪对象
Gun *g = [Gun new];
g->_size = @"AK47";
// g->_bulletCount = 1;
//创建士兵对象
Soldier *s = [Soldier new];
s->_name = @"许三多";
s->_life = 100;
s->_level = 5;
// [s fireByGun:g];
// [s fireByGun:g];
//创建子弹
Bullet *myBullet = [Bullet new];
myBullet->_size = @"5mm口径";
myBullet->_bulletCount = 3;
[s fireByGun:g andBullet:myBullet];
[s fireByGun:g andBullet:myBullet];
[s fireByGun:g andBullet:myBullet];
[s fireByGun:g andBullet:myBullet];
}
return 0;
实现功能:士兵开枪,枪射击子弹
枪类
名称:Gun
属性:型号(_size),子弹个数(_bulletCount)
行为:射击
人类
名称:Soldier
属性:姓名(_name),等级(_level),血量(_life)
行为:跑 蹲 开枪 跳
子弹类
名称:Bullet
属性:子弹个数,型号(_model)
*/
#import <Foundation/Foundation.h>
//子弹连续传递了两次
#pragma mark 子弹类的声明
@interface Bullet : NSObject
{
@public
NSString *_size;
int _bulletCount;
}
@end
#pragma mark 子弹类的实现
@implementation Bullet
@end
#pragma mark 枪类的声明
@interface Gun : NSObject
{
@public
//属性
NSString *_size;
// int _bulletCount; //普通
}
-(void) shoot:(Bullet *) bullet;
@end
#pragma mark 枪类的实现
@implementation Gun
-(void) shoot:(Bullet *) bullet {
//每射击一次,子弹个数-1
if (bullet->_bulletCount > 0) {
bullet->_bulletCount --;
NSLog(@"%@正在突突的射击。。。,剩余子弹:%d", _size, bullet->_bulletCount);
} else {
NSLog(@"蠢驴,没子弹了!");
}
}
@end
#pragma mark -
//#pragma mark 士兵类的声明-普通
//@interface Soldier : NSObject
//{
// @public
// NSString *_name;
// int _life;
// int _level;
//
//}
//-(void) fireByGun:(Gun *) gun;
//@end
//#pragma mark 士兵类的实现-普通
//@implementation Soldier
//-(void) fireByGun:(Gun *) gun {
// //让枪射击
// [gun shoot];
//}
//@end
#pragma mark 士兵类声明-高级
@interface Soldier : NSObject
{
@public
NSString *_name;
int _life;
int _level;
}
-(void) fireByGun:(Gun *) gun andBullet:(Bullet *) bullet;
@end
#pragma mark 士兵类实现-高级
@implementation Soldier
//开枪,传了子弹和弹夹
-(void) fireByGun:(Gun *) gun andBullet:(Bullet *) bullet {
//让枪装上子弹,然后射击
[gun shoot:bullet];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建枪对象
Gun *g = [Gun new];
g->_size = @"AK47";
// g->_bulletCount = 1;
//创建士兵对象
Soldier *s = [Soldier new];
s->_name = @"许三多";
s->_life = 100;
s->_level = 5;
// [s fireByGun:g];
// [s fireByGun:g];
//创建子弹
Bullet *myBullet = [Bullet new];
myBullet->_size = @"5mm口径";
myBullet->_bulletCount = 3;
[s fireByGun:g andBullet:myBullet];
[s fireByGun:g andBullet:myBullet];
[s fireByGun:g andBullet:myBullet];
[s fireByGun:g andBullet:myBullet];
}
return 0;
}
NSString类:字符串处理的类之一
1、创建常量字符串,注意使用@
2、输出字符串,注意%@
3、格式化穿件字符串
NSString
*imgName = [NSString
stringWithFormat:@"xxxx%02d, 1"];
4、用已经能够存在的字符串创建一个新的字符串
NSString
*s2 = [[nsstring alloc] initWithString:s1];
NSString字符串长度计算
//计算NSString字符串长度
//1、字符串纯英文
NSString * s1 = @"chenzichao";
NSUInteger len = [s1 length];
NSLog(@"len = %ld", len);
//2、字符串纯中文
//OC字符串中英文都一个字符占一个字节,C语言中,UTF-8,一个汉字三个字节
NSString *s2 = @"陈自超";
len = [s2 length];
//1、字符串纯英文
NSString * s1 = @"chenzichao";
NSUInteger len = [s1 length];
NSLog(@"len = %ld", len);
//2、字符串纯中文
//OC字符串中英文都一个字符占一个字节,C语言中,UTF-8,一个汉字三个字节
NSString *s2 = @"陈自超";
len = [s2 length];
//3、中英文混合
OC的多文件开发
不同的类放到不同的文件中,每个类的声明和实现分开,声明写在.h文件职工,实现放在相应地.m文件中,类名是什么,文件名前缀就是什么。main.m作为程序的入口。