------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文件