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

OC语言(二)

2015-07-31 12:15 549 查看
一、对象
1、对象的存储
类创建对象,每个对象在内存中占据一定的存储空间,每个对象都有一份属于自己的单独的成员变量。所有的对象公用类的成员方法,方法在整个内存中只有一份,类本身在内存中占据一份存储空间,类的方法存储于此。

每一个对象都包含一个 isa 指针,这个指针指向当前对象的所属的 类。
[p eat];表示给p所指向的对象发送一条eat消息,调用对象的eat方法,此时对象会顺着内部的 isa 指针找到存储于 类中的方法,执行。
isa 是对象中的隐藏指针,指向创建这个对象的类。

2、使用一个类创建多个对象
当使用一个类创建多个对象的时候,注意:
不同的对象在内存中分配的是不同的存储地址,所以各成员属性的地址也各不相同

1)[Person new] 的含义
>申请内存空间
>给实例变量初始化
>返回空间的首地址
1>那申请来的空间在内存的哪个区?
new 的时候申请的空间在内存的堆区(程序动态分配的内存空间)
当new的时候内存的布局是这么样的?
2>初始化的时候
如果实例变量是基本数据类型,此时给初始化为0
如果实例变量是OC字符串类型,此时给初始化为null

3>实例变量保存在什么地方?
保存在 堆区
p(指针变量)存放在栈区
4>对象方法保存在什么地方
代码区
5>为什么使用[p run];就可以调用方法了?如何调用的
首先找p对应的堆区的空间,然后找到 _isa指针,再找到 _isa指向的代码区的空间,然后到该空间中找 方法

下面通过画图来分析 类和对象 的存储及调用情况



这表示当我们声明了类和实现了类并且定义了一个该类 的对象时,内存中的存储情况是这样的,因为没有给对象的实例变量赋值所以系统初始化的值都是空或者是0。
所以当我们调用一个方法时,比如:[p run];是怎么实现的?
当我们 Person *p=[Person new];的时候,会把申请的地址传给指针p,所以当我们调用[p run];的方法时,如图所示,会通过指针p来访问内存栈区的指针_isa,再通过指针_isa间接的访问内存代码区,从而可以访问到方法run。

6>一个类可以创建多个对象的情况
又创建一个对象p1
Person *p1=[Person new];

从这个分析图可以知道,无论你定义几个Person类的对象,代码区在内存中只存储一份

3、#pragma mark指令的使用
功能:简单来说就是对代码的分组,方便代码查找和导航用
它们告诉Xcode编译器,要在编译器窗口顶部的方法和函数弹出菜单中将代码分离开。一些类(尤其是一些控制器类)可能很长,方法和函数弹出菜单可以方便于代码导航。此时加入#pragma指令(#pragma是一个编译指令)对代码进行逻辑组织很有效果。

4、函数和 对象方法的区别
对象方法:
1>对象方法的实现只能在@implementation ... @end 中
对象方法的声明只能写在@interface ....@end中间
2>对象方法都以 - 好开头,类方法都以 + 号开头
3>对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用
4>函数属于整个文件,可以写在文件中的任何位置,包括@implementation...@end之间,但写在@interface...@end之间会无法识别,函数的声明可以再main函数内部也可以在main函数外部。
5>对象方法归类\对象所有

函数:
1>所有的函数都是平行的
2>函数不存在隶属关系
3>使用的时候可以直接调用
4>不可以访问对象的成员变量

5、常见错误
1>@interface ...@end 和 @implementation ...@end不能嵌套包含
2>只有类的声明没有类的实现,只有方法的实现
3>漏写了@end
4>两个类的对象声明顺序(可以把顺序打乱)
5>成员变量没有写在{}里
6>方法的声明写在了{}里
7>在声明时不能对类的成员变量进行初始化,请注意成员变量不能脱离对象而独立存在
8>方法无法像函数那样的调用
9>成员变量和方法不能用static等关键字修饰,不要和C语言混淆
10>类的实现可以写在main函数后面,在使用之前只要声明就可以

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

1、对象作为方法的参数
主要演示
对象作为方法的参数
对象作为方法的返回值

程序代码如下
类 声明部分



方法实现部分



主函数部分



打印输出部分



总结:
无论是对象作为方法的参数还是返回值,都可以修改对象的变量

2、NSString类介绍及用法
NSString 是 Objective-C 中核心处理字符串的类之一

1)NSString 常见方法
1>创建常量字符串,注意使用" @ "符号
比如:NSString *str=@"This is a dog";

2>创建空字符串,给予赋值
比如:
因为NSString 是一个类
NSString *s1=[NSString new];
s1=@"asdf sdfg ddsf";

3>格式化创建字符串(按照指定的格式创建字符串)
格式:NSString *imgName = [NSString stringWithFormat:@"xxxxxx%02d.jpg",i];
例如:for(int i=0;i<10;i++)
{
NSString *imgName = [NSString stringWithFormat:@"xxxxxx%02d.jpg",i];
NSLog(@"%@",imgName);
}

4>用一个已经存在的字符串创建一个新的字符串
NSString *s2=[[NSString alloc] initWithString:s1];
NSLog(@"%@",s2);

3、NSString字符串长度计算方法
通过调用NSString类的对象方法 length 可以获得字符串的长度

1)纯英文字符



打印如下



总结:
>可以看出一个字符占用一个字节
>用length计算出来的长度不包含‘\0’

2)中英文混合



打印如下



总结:
1>中英文字符都是占用一个字节
2>在C语言中,中文字符占3个字节

3)纯中文



打印如下:



总结:
1>中文在 OC中也占用一个字节
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: