//
创建对象
//[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作为程序的入口。