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

来源:互联网 发布:恒生指数期货模拟软件 编辑:程序博客网 时间:2024/05/25 20:01
一、对象的存储
    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(@"装弹完毕!");}@endint 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;}


0 0
原创粉丝点击