黑马程序员-OC回顾-基础语法(二)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

OC回顾-基础语法(二)


一、对象的存储细节

1、对象的存储细节

    类创建对象,每个对象在内存中都占据一定的存储空间,每个对象都有一份属于自己的单独的成员变量,所有的对象公用类的成员方法,方法在整个内存中只有一份,类本身在内存中占据一份存储空间,类的方法存储与此。

  

每一个对象都包含一个isa指针,这个指针指向当前对象所属的类。

isa是对象中的隐藏指针



  

[Person new]作了三件事

1)、申请内存空间

2)、给实例变量初始化

3)、返回空间的首地址


内存分配的过程

1、在内存的代码区分配空间存储Person类的信息,程序终止前只会加载一次。

地址是:0x100。

2、[Person new]会在堆区分配空间,存放实例变量,并初始化,然后返回首地址。

还有一个isa指针,指向代码区中的类,地址是:0x100。

地址是:0x10。

初始化:数值型的为0,字符串的为null。

3、p存在栈区,存的是堆区的地址。

地址是:0x10 。


当执行[p run]方法的时候

在栈区中的p指向堆区中的isa指针,isa指针又指向代码区中的类的内存空间,然后找到run方法,最后执行。


2、使用一个类创建多个对象


  

注意:

1)不同的对象在内存中分配的是不同的存储空间,所以个成员属性的地址也不相同。

3)、类在代码区中的存储空间只有一份,几个对象公用这个空间。


二、#pragma mark指令的使用


#pragma mark指令

功能:对代码分组,方便代码的查找和导航用。

告诉Xcode,要再编译器在方法和函数弹出菜单中将代码分隔开。

1)第一种:#pragma mark 分组名称

 


2)第二种:分割线  #pragma mark-

 


3)第二种方法#pragma mark - 名称 效果等同于 

#pragma mark -
#pragma mark 分组(标识)名称 

三、函数和对象方法的区别

1、对象方法: -(void)run;

1)对象方法的实现只能写在@implementation和@end中,对象方法的声明只能写在@interface和@end中间。

2)对象方法以“-”开头,类方法以“+”开头。

3)对象方法只能由对象来调用,类方法只能由类来调用,不能当作函数一样调用

4)函数属于整个文件,可以写在文件中的任何位置,但是不能写在@interface和@end中,函数的声明可以在main函数内部也可以在main函数外部。

5)对象方法归对象所有


2、函数  

1)所有的函数都是平行的

2)函数不存在隶属关系

3)使用的时候可以直接调用

4)不可以访问对象中的成员变量


四、常见错误汇总

1、@interface @end和@implementation @end不能嵌套包含。

2、只有类的声明,没有类的实现。

3、没有@end。

4、类的实现要在类的声明之后,要是有多个类,实现的顺序可以打乱。

5、成员变量没有写在{ }里。

6、方法的声明写在了{}里。

7、在声明时不能对类的成员变量进行初始化。

8、方法无法像函数那样被调用。

9、成员变量不能用static等关键字修饰。

10、类的实现可以写在main函数后面,在使用之前只要有声明就可以。


五、对象和方法之间的关系

1、对象作为方法的参数

2、对象作方法的返回值

/*
 对象和方法之间的关系
 1、对象作为方法的参数
 2、对象作方法的返回值
 */

#import <Foundation/Foundation.h>
@interface Person:NSObject
{
    @public
    NSString *_name;
    NSString *_sex;
}
//对象作为方法的参数
-(void)display:(Person *) person;
//对象做方法的返回值
-(Person *)changeInformetion:(Person *) person;
@end
@implementation Person
-(void)display:(Person *) person{
    NSLog(@"姓名:%@,性别:%@",person->_name,person->_sex);
}
-(Person *)changeInformetion:(Person *) person{
    person->_name=@"张无忌";
    person->_sex=@"男";
    return person;
}



@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p1=[Person new];
        p1->_name=@"赵敏";
        p1->_sex=@"女";
        [p1 display:p1];//对象作为函数参数
        Person *p2=[Person new];
        p2=[p1 changeInformetion:p1];
        [p2 display:p2];
    }
    return 0;
}



六、对象作为方法的参数的连续传递

实现功能:

士兵开枪  枪射击子弹

分析

枪类:

类名:Gun

型号:_size       子弹个数:_bulletCount

行为:射击

士兵类:

类名:Solider

属性:姓名_name  等级: _level

行为: 跑 跳 开枪


/*
 实现功能:
 士兵开枪  枪射击子弹
 枪类:
 类名:Gun
 型号:_size       子弹个数:_bulletCount
 行为:射击
 士兵类:
 类名:Solider
 属性:姓名_name  等级: _level
 行为: 跑 跳 开枪

 */


#import <Foundation/Foundation.h>
#pragma mark -枪类
@interface Gun:NSObject
{
    @public
    int _size;
    int _bulletCount;
}
-(void)shoot:(int) bulletcount;
@end
@implementation Gun
-(void)shoot:(int) bulletcount{
    if (bulletcount>0) {
        bulletcount--;
        NSLog(@"枪突突地在射击!剩余子弹数%d",bulletcount);
    } else {
        NSLog(@"别突突了,没有子弹了!");
    }
}
@end
#pragma mark -士兵类
@interface Solider:NSObject
{
    @public
    NSString *_name;
    int _level;
}
-(void)run:(NSString *) name;
-(void)jump:(NSString *) name;
-(void)useGun:(Gun *) gun;
@end
@implementation Solider
-(void)run:(NSString *) name{
    NSLog(@"%@跑了几步!",name);
}
-(void)jump:(NSString *) name{

NSLog(@"%@来了一个大跳!",name);
}
-(void)useGun:(Gun *) gun{
    [gun shoot:gun->_bulletCount];
}
@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Gun *gun=[Gun new];
        gun->_bulletCount=5;
        gun->_size=5;
        Solider *s1=[Solider new];
        s1->_name=@"许三多";
        s1->_level=2;
        [s1 useGun:gun];
    }
    return 0;
}



七、NSString类介绍及用法

NSString是OC中核心处理字符串的类之一。

NSString常见用法

1、创建常量字符串

NSString *str = @“张三丰”;

2、创建空字符串,然后再赋值。

 NSString *str=[NSString new];

str=@“张无忌”;

3、创建格式化字符串:占位符(由一个%和一个字符组成)

4、使用NSLog是不能打印c中的字符串的。


八、NSString字符串长度计算方法

通过调用NSString类的对象方法 length 可以获得字符串的长度(不包括 \0)。

1、纯英文字符

2、中英文混合

3、纯中文

在C语言中,一个汉字占用3个字节,但是在OC中一个汉字占用1个字节。


九、OC多文件开发介绍

在工作中,通常把不同的类放到不同的文件中,每个类的声明和实现分开,声明写在.h文件中,实现写在相应地.m文件中,类名是什么,文件名就是什么。在主函数及类的实现文件中要使用#import包含相应地头文件。

import有两个作用:

1、和include一样,完完全全的拷贝文件的内容。

2、可以自动防止文件内容的重复拷贝(即使文件被多次包含,也只拷贝一份)。

    在Xcode中,是把所有的.m文件都进行编译链接的,如果出席那重复定义的错误,那大部分问题根源应该就是文件内容被重复包含或者是包含.m文件所引起的。

源文件中不论是使用include还是import,都不能包含.m或者是.c文件,只能放声明。因此,在OC中通常把类拆分开来,分成声明和实现两个部分。

    多文件开发也是编程思想的一种体现,可以说.h和.m文件是完全独立的,只是为了要求有较好的可读性,才要求两个文件的文件名一致,这也是把接口和实现分离,让调用者不必去关心具体的实现细节。

多文件开发的实现步骤


1)创建类的声明文件(.h的文件) 

i.创建新的文件 

ii.创建OC类声明文件 

 Iii.选择保存的位置 

 

创建即可。

 2)创建类的实现文件(.m的文件) 

创建文件 

i. 选择OC类文件 

 iii.填写文件名 

点击Next 创建即可。 

也可以使用如下方法,快速创建.h和.m文件 

  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值