黑马程序员——OC语言基础---对象和方法
来源:互联网 发布:我的世界pe联机枪械js 编辑:程序博客网 时间:2024/04/29 06:07
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
一、对象的存储细节
1、对象的存储细节
类创建对象,每个对象在内存中都占据一定的存储空间,每个对象都有一份属于自己的单独的成员变量,所有的对象公用类的成员方法,方法在整个内存中只有一份,类本身在内存中占据一份 存储空间,类的方法存储于此。
每一个对象都包含一个isa指针.这个指针指向当前对象所属的类。
[p eat];表示给p所指向的对象发送一条eat消息,调用对象的eat方法,此时对象会顺着内部的isa指针找到存储于类中的方法,执行。
isa是对象中的隐藏指针,指向创建这个对象的类。
在OC中存在一个名为id的类型,这个和上面所说这个isa指针有一定的联系.
C代码
typedef struct objc_object {
Class isa;
} *id;
其中Class类型为指向objc_class结构体的指针类型. 这些对象在内存中都是由其地址唯一标示,所有的对象都是id类型的.
2、使用一个类创建多个对象
Car *car2 = [Car new]; Car *car3 = [Car new]
当使用一个类创建多个对象的时候,注意:
1)不同的对象在内存中分配的是不同的存储地址,所以各成员属性的地址也各不相同
#import <Foundation/Foundation.h>@interface Person : NSObject{ @public int _age; float _weight; NSString *_name;}//行为-(void)run;@end@implementation Person-(void)run{ NSLog(@"人正在跑");}@endint main(int argc, const char * argv[]) { @autoreleasepool { //创建对象 Person *p = [Person new]; p->_name = @"柯南"; p->_age = 13; //_age 0 //_name null NSLog(@"姓名:%@,年龄:%d,体重:%f",p->_name,p->_age,p->_weight); [p run]; //[Person new] 做了3件事情 // 1) 申请内存空间 // 2)给实例变量初始化 // 3) 返回空间的首地址 //1、申请的空间在内存的哪个区? // new 的时候申请的空间在内存的堆区(程序动态分配的内存空间) // 当new的时候内存的布局是这么样的 //初始化的时候: //如果实例变量是基本数据类型,此时给初始化为0 //如果 。。。。OC字符串类型 null //2、实例变量又保存在什么地方 // 堆区 // p(指针变量) 存放在栈区 //3、对象方法保存在什么地方 // 代码区 //4、为什么使用 [p run]; 就可以调用方法了 ?如何调用的 // 首先找p对应的堆区的空间,然后找到 _isa指针,再找到_isa指向的 //代码区的空间,然后到该空间中找 方法 //5、一个类可以创建多个对象 //又创建了一个对象p1 Person *p1 = [Person new]; p1->_name = @"贝娜"; p1->_age = 33; NSLog(@"姓名:%@,年龄:%d,体重:%f",p1->_name,p1->_age,p1->_weight); [p1 run]; } return 0;}
二、#pragma mark指令的使用
1、#pragma mark指令的使用
功能:简单来说就是对代码的分组,方便代码查找和导航用的
它们告诉Xcode编译器,要在编辑器窗格顶部的方法和函数弹出菜单中将代码分隔开。一些类(尤 其是一些控制器类)可能很长,方法和函数弹出菜单可以便于代码导航。此时加入#pragma 指令 (#pragma是一个编译指令)对代码进行逻辑组织很有效果。
一个类里我们总会有一些方法的功能与性质是相差不多的,你可能会有把方法们分组的想 法。Xcode已经有了类似的支持,它就是 #pragma mark。
1)第一种用法:分隔线 #pragma mark -
2)第二种用法:#pragma mark 分组(标识)名称
3)第二种方法#pragma mark - 名称
效果等同于
#pragma mark -
#pragma mark 分组(标识)名称
#import <Foundation/Foundation.h>#pragma mark dog类的声明//这是dog的类声明@interface Dog : NSObject-(void)run;-(void)lookHome;@end//这是dog类的实现@implementation Dog-(void)run{}-(void)lookHome{}@end#pragma mark -#pragma mark Person类的声明@interface Person : NSObject{@public int _age; float _weight; NSString *_name;}//行为-(void)run;@end@implementation Person-(void)run{ NSLog(@"人正在跑"); }void test(){ NSLog(@"test!"); //int a = _weight;}@endint main(int argc, const char * argv[]) { @autoreleasepool { //创建对象 Person *p = [Person new]; p->_name = @"柯南"; p->_age = 13; //_age 0 //_name null NSLog(@"姓名:%@,年龄:%d,体重:%f",p->_name,p->_age,p->_weight); [p run]; Person *p1 = [Person new]; p1->_name = @"贝娜"; p1->_age = 33; NSLog(@"姓名:%@,年龄:%d,体重:%f",p1->_name,p1->_age,p1->_weight); [p1 run]; //run(); test(); } return 0;}
三、函数和对象方法的区别
1、函数和对象方法的区别
对象方法:
-(void)run;
(1)对象方法的实现只能写在@implementation...@end中,对象方法的声明只能写在@interface...@end中间
(2)对象方法都以-号开头,类方法都以+号开头
(3)对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用
(4)函数属于整个文件,可以写在文件中的任何位置,包括@implementation...@end中,但写在 @interface...@end会无法识别,函数的声明可以再main函数内部也可以在main函数外部。
(5)对象方法归类\对象所有
函数:
void run()
{
}
(1)所有的函数都是平行的
(2)函数不存在隶属关系
(3)使用的时候可以直接调用
(4)不可以访问对象中的成员变量
OC中可以定义C中的函数,头文件可以声明,.m文件可以实现;但C函数的范围仅限于这两个文件。与OC的语法没关系;
四、常见错误汇总
1、常见错误
(1)@interface @end和@implementation @end不能嵌套包含 OC是弱语法,可以只有@implementation,但实际开发中千万不要这样。
(2)只有类的声明没有类的实现,只有@interface没有@implementation时,程序编译能够通过,但是执行报错。
(3)漏写@end
(4)两个类的对象声明顺序(可以把顺序打乱)
(5)成员变量没有写在{}里
(6)方法的声明写在了{}里面
(7)在声明时不能对类的成员变量进行初始化,请注意成员变量不能脱离对象而独立存在
(8)方法无法像函数那样的调用
(9)成员变量和方法不能用static等关键字修饰,不要和c语言混淆
(10)类的实现可以写在mian函数后面,在使用之前只要有声明就可以
经典错误:
'-[Person run]: unrecognized selector sent to instance 0x100103410'
run方法没有实现
五、对象和方法之间的关系
1、对象作为方法的参数
假设有Person类: Person类有name、sex属性
假设实例化Person的对象
Person *p = [Person new];
p->name ="凤姐";
p->sex = "女";
...... ......
-(void) displayPerson:(Person *)person{
NSLog("姓名:%@",person->name);
NSLog("姓名:%@",person->sex);
} ...... ......
2、对象做方法的返回值
-(Person *)changePerson:(Person *)person{
person->name = @"唐僧";
person->sex =@"男";
person->age = person->age+1;
return person;
}
Person *p2 = [d changePerson:p1];
[d displayPerson:p2];
#import <Foundation/Foundation.h>// 0 1 2typedef enum{kSexMan,kSexWomen,kSexYao} Sex;//定义个person类@interface Person : NSObject{ @public NSString *_name; Sex _sex;}//对象作为方法的参数-(void)dispPerson:(Person *) person;//对象作为方法的返回值-(Person *)changSex:(Person*) person;@end@implementation Person//对象作为方法的参数-(void)dispPerson:(Person *) person{ NSLog(@"姓名:%@,性别:%d",person->_name,person->_sex);}//对象作为方法的返回值 p1-(Person *)changSex:(Person*) person{ //修改姓名 person->_sex = kSexWomen; return person; //p1}@endint main(int argc, const char * argv[]) { @autoreleasepool { //创建对象p Person *p = [Person new]; //创建对象p1 Person *p1 = [Person new]; p1->_sex = kSexYao; p1->_name = @"刷我的卡"; Person *p2 = [Person new]; p2->_name = @"张三丰"; p2->_sex = kSexWomen; [p dispPerson:p2]; //修改性别 //[p changSex:p1]; Person *p3 = [p changSex:p1]; //p3 p1 都指向同一个空间 NSLog(@"姓名:%@,性别:%d",p3->_name,p3->_sex); } return 0;}
六、NSString 类介绍及用法
NSString是 Objective-C 中核心处理字符串的类之一。
1、NSString常见方法
1)创建常量字符串,注意使用“@“符号。
NSString *a1 = @"This is a String!";
2)创建空字符串,给予赋值。
3)创建格式化字符串:占位符(由一个%加一个字符组成)
4)使用NSLog是不能打印c中的字符串的
char *str = "淡定度";
NSLog(@"%s",str);
<span style="font-size:14px;">#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { @autoreleasepool { //NSString 是OC中字符串处理的类 //1、创建一个字符串(1) NSString *s = @"banzhang jiecao diaole "; //特殊用法 //2、输出一个字符串 NSLog(@"%@",s); //NSString是一个类 NSString *s1 = [NSString new]; s1 =@"jian le ma"; NSLog(@"%@",s1); //3、创建字符串的第三种方法 // 格式化创建字符串(按照指定的格式创建字符串) // NSString *imgName = [NSString stringWithFormat:@"xxxxxx%02d.jpg",i];// for (int i=0; i<10; i++) {// NSString *imgName = [NSString stringWithFormat:@"xxxxxx%02d-%02d.jpg",i,i+1];// NSLog(@"%@",imgName);// } //4、用一个已经存在的字符串创建一个新的字符串 NSString *s2 = [[NSString alloc] initWithString:s1]; NSLog(@"s2 = %@",s2); } return 0;}</span>
七、OC多文件开发介绍
1、为什么要使用多文件?
在工作中,通常把不同的类放到不同的文件中,每个类的声明和实现分开,声明写在.h头文件 中,实现写在相应的.m文件中去,类名是什么,文件名的前缀就是什么。
假设有两个类,分别是Person类和Dog类,则通常有下面五个文件:
(1)Person.h Person类的声明文件
(2)Person.m Person类的实现文件
(3)Dog.h Dog类的声明文件
(4)Dog.m Dog类的实现文件
(5)Main.m 主函数(程序入口) 在主函数以及类的实现文件中要使用#import包含相应的头文件。
补充:import有两个作用:
一是和include一样,完完全全的拷贝文件的内容;
二是可以自动防止 文件内容的重复拷贝(即使文件被多次包含,也只拷贝一份)。
在使用命令行进行编译链接文件的时候,通常是把.m文件单文件编译,然后再把所有的目标文件链接,但是在Xcode中,是把所有的.m文件都进行编译链接的,如果出现重复定义的错误,那大部分问题根源应该就是文件内容被重复包含或者是包含.m文件所引起的。
源文件中不论是使用include还是import,都不能包含.m或者是.c文件,只能放声明。因此,在OC中通常把类拆分开来,拆分成声明和实现两个部分。
提示:这也是编程思想的一种体现,可以说.h和.m文件时完全独立的,只是为了要求有较好的可读性,才要求两个文件的文件名一致,这也是把接口和实现分离,让调用者不必去关心具体的实现细节。 Xcode是写一行编译一行,有简单的修复功能,红色是错误提示,黄色警告。如果在程序中声明了一个变量,但是这个变量没有被使用也会产生警告信息。在调试程序的时候,如果发现整个页面都没有报错,但是一运行就错误,那么一定是链接报错。
-------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
- 黑马程序员——OC语言基础---对象和方法
- 黑马程序员——OC语言基础---类和对象
- 黑马程序员—OC语言基础—类与对象
- 黑马程序员——OC基础语法----类、对象、方法
- 黑马程序员—OC语言基础—方法小结
- 黑马程序员——OC语言中的类和对象
- 黑马程序员——OC基础:类和对象
- 黑马程序员——OC基础:类和对象
- 黑马程序员—OC语言基础—构造方法和分类
- 黑马程序员——OC语言------id和构造方法
- 黑马程序员---IOS基础---OC 中对象和方法
- 黑马程序员****OC语言基础****继承和方法重写
- 黑马程序员——OC 基础:setter和getter方法
- 黑马程序员—OC基础-- ==和 isEqual方法
- 黑马程序员---OC基础---OC简介、OC与C的差异、类和对象与方法
- 黑马程序员——OC基础学习(二)---对象方法和类方法的学习知识总结
- 黑马程序员-OC语言-类和对象
- 黑马程序员--oc语言类和对象
- 字符串连接效率探究
- 黑马程序员——c语言基础之指针
- Handler一定要在主线程实例化吗?new Handler()和new Handler(Looper.getMainLooper())的区别
- 面向对象随想
- 转个堆与栈的区别
- 黑马程序员——OC语言基础---对象和方法
- 代理模式 之案例
- C和C++相互调用
- 把一颗二叉树转为顺序排列的双向链表
- HTML,CSS,font-family:中文字体的英文名称 (宋体 微软雅黑)
- 移动html特殊链接:打电话,发短信,发邮件
- OS X 10.11 El Capitan U盘安装制作 OS X 10.11安装
- easyui 的dialog 的href加载,子页面的document ready事件无效!
- 每个软件工程师要知道的十件事