您的位置:首页 > 编程语言 > C语言/C++

【OC语言】第二篇·对象的作用、字符串类型以及多文件开发

2015-08-17 08:08 639 查看
一、对象的存储
1、Person *p = [Person new] 对Person类实例化的时候做了三件事
1)申请内存空间
2)给实例变量初始化
3)返回空间首地址
注意:
1)用new 的时候申请的的空间在内存的堆区(程序动态分配的内存空间)。并且在堆区对类的成员变量进行初始化,整型,实型初始化为0,字符串初始化为null。
2)实例变量[Person new] 存放在堆区,指针变量存放在栈区。
3)对象方法存放在代码区
4)使用[p run];调用方法:首先找p对应的堆区空间,然后找到_isa指针(在堆区实例变量首地址位置),再找到_isa指向的代码区空间,然后到该空间中找方法。
2、不同的对象在内存中分配的是不同的存储地址,所以各成员属性的地址(在堆区)也各不相同。



二、#pragma mark预处理指令的使用
1. 功能:简单来说就是对代码的分组,方便代码的查找和导航
2. 用法一:分隔线 #pragma mark -
3. 用法二:分组标识 #pragma mark 分组(标识)名称

三、关于结构体变量的赋值
1.错误方法
typedef struct date{
int year;
int month;
int day;
} Mydate;
Mydate date1;
date1 = {1988,12,12};

错误原因:因为定义数组的时候也会用到{数据项}这种赋值方法,编译器不知道是给结构体还是数组赋值,所以会报错,只要加一个强制转换会解决。
2. 正确方法:
1)解决办法一:

Mydate date2;
date2 = (Mydate){1999,2,3};

2)解决办法二:

Mydate date3;
Mydate date4 = {1987,2,15};
date3 = date4;

3)解决办法三:逐个赋值

四、NSString类介绍及使用
1.NSString是OC中核心处理字符串类之一。
2. 常见用法:
1)创建常量字符串,注意用“@”
(1) NSString *str = @"This is a OC String";
(2)NSString *s1 = [NSString new];
s1=@"This is a string";
(3)格式化创建字符串
NSString *imgName = [NSString stringWithFormat:@"xxxxxxx%02d.jpg",i];
(4)NSString *s2 = [[NSString alloc] initWithString:s1];
2)输出一个字符串
NSLog(@);
3. NSString 字符串长度计算
int len = [s1 length];
注意:OC当中中英文都占用1个字节,符号也1个字节。
C中:英文1个字节,中文3个字节,符号一个字节。

五、OC的多文件开发
1. 在工作当中,通常把不同的类,放到不同的文件中,每个类的声明和实现分开。声明在.h头文件中,实现在.m文件当中,类名是什么,文件名的前缀就是什么。
2. 注意:
1).h和.m文件要同名
2)文件名就是类名,一看文件就知道文件是哪个类
3. 多文件开发的实现:
1)自己创建.h和.m文件
2)创建一个Cocoa的类文件

六、对象作为方法的参数连续传递示例程序

#import <Foundation/Foundation.h>

#pragma mark Bullet子弹类的声明
@interface Bullet:NSObject
{
@public
int _bulletNum;
NSString *_size;
}
//行为声明
-(void) addBullet:(int)num;
@end

#pragma mark -
#pragma mark Bullet类的实现
@implementation Bullet
-(void) addBullet:(int)num{
_bulletNum += num;
NSLog(@"目前有:%d个子弹",_bulletNum);
}
@end

#pragma mark -
#pragma mark Gun类的声明
@interface Gun:NSObject
{
@public
NSString *_size; //抢的型号
}
//行为声明
-(void)shoot:(Bullet *)bullet;
@end

#pragma mark -
#pragma mark Gun类的实现
@implementation Gun
//方法的实现
-(void) shoot:(Bullet *)bullet
{
if(bullet -> _bulletNum <= 0)
NSLog(@"咔咔,%@没子弹了!",_size);
else{
NSLog(@"啪啪啪啪");
bullet -> _bulletNum --;
}
}
@end

#pragma mark -
#pragma mark Soldier类的声明
typedef enum {kLevelA,kLevelB,kLevelC}sLevel;
@interface Soldier:NSObject
//成员声明
{
@public
NSString *_name;
int _life;
sLevel _level;

}
//方法的声明
-(void) fireByGun:(Gun *)gun and:(Bullet *)bullte and:(int)count; //射击
-(void) addBullet:(Bullet *)bullet and:(int)num; //添加子弹
@end
#pragma mark -
#pragma mark Soldier类的实现
@implementation Soldier

//方法的实现
-(void) fireByGun:(Gun *)gun and:(Bullet *)bullte and:(int)count
{
for(int i=0;i<count;i++)
{
[gun shoot:bullte];
}
}
-(void) addBullet:(Bullet *)bullet and:(int)num
{
[bullet addBullet:num];
NSLog(@"装弹完毕!");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Bullet *bullet = [Bullet new];
bullet -> _size =@"5MM";
bullet -> _bulletNum = 3;
Gun *gun = [Gun new];
gun -> _size = @"连发步枪M16";
Soldier *s1 = [Soldier new];
s1 ->_name = @"Wang Baoqiang";
s1 -> _level = kLevelA;
s1 -> _life = 100;
[s1 fireByGun:gun and:bullet and:5];
[s1 addBullet:bullet and:6];

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: