OC的构造方法与分类知识点总结
OC语言构造方法:
用来初始化对象的方法,对象方法,以减号开头
为了让对象创建出来,成员变量就会有一些固定的值
重写构造方法的注意点:
先调用父类的构造方法([super init])
再进行子类内部成员变量的初始化
参考:http://www.codes51.com/article/detail_111604.html
构造方法的调用:
完整的创建一个可用的对象:Person *p=[Person new];
New方法的内部会分别调用两个方法来完成2件事情,
1)使用alloc方法来分配存储空间(返回分配的对象);
2)使用init方法来对对象进行初始化。
可以把new方法拆开如下:
1.调用类方法+alloc分配存储空间,返回未经初始化的对象
Person *p1=[person alloc];
2.调用对象方法-init进行初始化,返回对象本身
Person *p2=[p1 init];
3.以上两个过程整合为一句:
Person *p=[[Person alloc] init];
说明:init方法就是构造方法,是用来初始化对象的方法,注意这是一个对象方法,一减号开头。默认初始化完毕后,所有成员变量的值都为0。
例如:
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject @property int age; @end
Person.m
#import "Person.h" @implementation Person // 重写-init方法 //- (id)init //{ // // 1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性 // self = [super init]; // 当前对象 self // // // // 2.如果对象初始化成功,才有必要进行接下来的初始化 // if (self != nil) // { // 初始化成功 // _age = 10; // } // // // 3.返回一个已经初始化完毕的对象 // return self; //} - (id)init { if ( self = [super init] ) { // 初始化成功 _age = 10; } // 3.返回一个已经初始化完毕的对象 return self; } @end
main.m
#import <Foundation/Foundation.h> #import "Person.h" #import "Student.h" // 构造方法:用来初始化对象的方法,是个对象方法,-开头 // 重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值 /* 重写构造方法的注意点 1.先调用父类的构造方法([super init]) 2.再进行子类内部成员变量的初始化 */ int main() { // Person *p = [Person new]; /* 完整地创建一个可用的对象 1.分配存储空间 +alloc 2.初始化 -init */ // 1.调用+alloc分配存储空间 // Person *p1 = [Person alloc]; // 2.调用-init进行初始化 // Person *p2 = [p1 init]; // // 调用-init进行初始化 // Person *p3 = [Person new]; // // // // 每个Person对象创建出来,他的_age都是10 // Person *p4 = [[Person alloc] init]; Student *stu = [[Student alloc] init]; NSLog(@"------"); return 0; }
构造方法使用注意
(1)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候应该首先对从父类继承而来的成员变量先进行初始化。
(2)原则:先初始化父类的,再初始化子类的。
(3)重写构造方法的目的:为了让对象方法一创建出来,成员变量就会有一些固定的值。
(4)注意点:
1、先调用父类的构造方法[super init];
2、再进行子类内部成员变量的初始化。
自定义构造方法:
自定义构造方法的规范:
(1)一定是对象方法,以减号开头
(2)返回值一般是id类型
(3)方法名一般以initWith开头
自定义构造方法例子:
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject @property NSString *name; @property int age; /* 自定义构造方法的规范 1.一定是对象方法,一定以 - 开头 2.返回值一般是id类型 3.方法名一般以initWith开头 */ - (id)initWithName:(NSString *)name; - (id)initWithAge:(int)age; // initWithName:andAge: - (id)initWithName:(NSString *)name andAge:(int)age; @end
Person.m
#import "Person.h" @implementation Person - (id)init { if ( self = [super init] ) { _name = @"Jack"; } return self; } - (id)initWithName:(NSString*)name { if ( self = [super init] ) { _name = name; } return self; } - (id)initWithAge:(int)age { if ( self = [super init] ) { _age = age; } return self; } - (id)initWithName:(NSString *)name andAge:(int)age { if ( self = [super init] ) { _name = name; _age = age; } return self; } @end
对应的main.m
#import <Foundation/Foundation.h> #import "Person.h" #import "Student.h" int main(int argc, const char * argv[]) { @autoreleasepool { Student *p = [[Student alloc] initWithName:@"Jim" andAge:29 andNo:10]; NSLog(@"00000"); } return 0; }
自定义构造方法的使用注意:
(1)自己做自己的事情
(2)父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性
成员变量的作用域:
@public
在任何地方都能直接访问对象的成员变量
@private
只能在当前类的对象方法中访问
@protected(可以不写,默认)
能在当前类和子类的对象方法中直接访问
@package
只要处在同一个框架中,就能直接访问对象的成员变量
@interface和@implementation中不能声明同名的成员变量
在@implementation中声明变量,默认是@private的
分类-Category:
分类,在不改变原来模型的情况下,可以给某个类扩充一些方法
分类只能增加方法, 不能增加成员变量
分类方法实现中可以访问原来类中声明的成员变量
分类的优先级最高,方法优先去分类中去找,再去原来类中去找,最后再去父类中找
分类可以重写原来类中的方法,但是会覆盖掉,会导致原来的方法失效,没法再使用
方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类 --> 父类
分类的应用一般是扩展系统的类的方法,比如扩展NSString类的方法
格式:
分类的声明 @interface 类名 (分类名称) // 方法声明 @end ? 分类的实现 @implementation 类名 (分类名称) // 方法实现 @end
好处:
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作
给系统自带的类添加分类:
给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数
给NSString增加一个对象方法:计算当前字符串中阿拉伯数字的个数
注意:
Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类
Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法
多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效
分类的实例:
main.m
/* 分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法 使用注意: 1.分类只能增加方法,不能增加成员变量 2.分类方法实现中可以访问原来类中声明的成员变量 3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用 4.方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类 --> 父类 */ #import <Foundation/Foundation.h> #import "Person.h" #import "Person+MJ.h" #import "Person+JJ.h" int main() { Person *p = [[Person alloc] init]; //p.age = 10; // 优先去分类中查找,然后再去原来类中找,最后再去父类中找 [p test]; // [p study]; return 0; }
Person.h
/* 分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法 使用注意: 1.分类只能增加方法,不能增加成员变量 2.分类方法实现中可以访问原来类中声明的成员变量 3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用 4.方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类 --> 父类 */ #import <Foundation/Foundation.h> #import "Person.h" #import "Person+MJ.h" #import "Person+JJ.h" int main() { Person *p = [[Person alloc] init]; //p.age = 10; // 优先去分类中查找,然后再去原来类中找,最后再去父类中找 [p test]; // [p study]; return 0; }
Person.m
#import "Person.h" @implementation Person - (void)test { NSLog(@"Person-test"); } @end
OC的构造方法与分类知识点总结的更多相关文章
- 「OC」构造方法和分类
一.构造方法 (一)构造方法的调用 创建一个可用的对象:Person *p=[Person new]; new方法实际上是分为两步来创建一个对象: 1)使用+alloc方法来分配存储空间(返回分配的对 ...
- OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法
一. 分类-Category 1. 基本用途:Category 分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...
- OC语言构造方法
OC语言构造方法 一.构造方法 (一)构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法 ...
- 李洪强iOS开发之OC语言构造方法
OC语言构造方法 一.构造方法 (一)构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法 ...
- OC基础--构造方法 id类型
new方法实现原理: new做了三件事情 1.开辟存储空间 + alloc 方法 2.初始化所有的属性(成员变量) - init 方法 3.返回对象的地址 [Person new]; == [[Pe ...
- OC基础--构造方法
OC语言中类的构造方法学了两种: 一.方法一:[类名 new] 例:[Person new] 缺点:可扩展性不强,假如在Person类中有_age 成员变量,在初始化时想让_age 中的值为20,ne ...
- OC特有语法:分类category,给NSString增加方法计算字符串中数字的个数
1:分类的使用场景:想对一个类,扩充一些功能,而又不改变原来类的模型,也不用继承,这时OC中的特有语法:分类可以做到: 当然分类也是一个类,也需要声明和实现,声明在.h文件中,实现在.m文件中,格式如 ...
- oc语言学习之基础知识点介绍(五):OC进阶
一.点语法介绍 /* 以前封装后,要给属性赋值,必须调用方法 这样做,有两个缺点: 1.代码量多,调用方法要写的东西多. 2.看起来并不像是给属性赋值,也不像取值. 我们用点语法就可以更好的解决! 点 ...
- oc语言学习之基础知识点介绍(一):OC介绍
一.第一个OC程序 #import <Foundation/Foundation.h> //导入头文件 int main(int argc, const char * argv[]) ...
随机推荐
- hdu 4945 2048 (dp+组合的数目)
2048 Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
- 设置状态栏样式Demo
达到的效果: 色有黑色变为了白色 //设置状态条的样式 - (UIStatusBarStyle)preferredStatusBarStyle { returnUIStatusBarStyleLigh ...
- Android开发之合并文件的几种方式
以下介绍合并文件的几种方式,并通过合并amr文件来举例介绍合并文件的详细流程.amr格式的文件头是6字节,所以在进行文件合并的时候要减去除第一个文件以外的其它文件的文件头. 注意:不同文件的文件头是不 ...
- SUPPORTDIR引用的文件的加入
上一篇转载了SUPPORTDIR的理论解释,如今截图说明实际操作: 选择依赖的语言,在右面的files框里右键点击,选择Insert Files插入文件,编译.由于安装得时候,压缩包会解压成一个暂时文 ...
- URL压缩算法的短地址
时下,短网址应用已经在全国各大微博上開始流行了起来.比如QQ微博的url.cn,新郎的t.cn等. 我们在新浪微博上公布网址的时候.微博会自己主动判别网址.并将其转换,比如:http://t.cn/h ...
- JBPM4实例教程
JBPM语言概述:全名 Java Business Process Management ,它是覆盖了业务流程管理.工作流.服务协作等领域的一个开源的.灵活的.易扩展的可运行流程语言框架. 是开源 ...
- 坑爹BUG,没有详细的看还真看不出问题
Queue queue = new LinkedList<String> (); for(int i = 0; i<20; i++) { queue.add("坑爹&quo ...
- vs2010中文简体版下载链接(含中文msdn)
昨天朋友说vs2010中文版能够下载了,自己開始还不相信,正好周末,于是就下载了试一下 安装了果然是中文版,本来是msdn订阅用户才干够下载的,感谢上传的网友. 文件名称 cn_visual_stud ...
- CentOS7 安装spark集群
Spark版本 1.6.0 Scala版本 2.11.7 Zookeeper版本 3.4.7 配置虚拟机 3台虚拟机,sm,sd1,sd2 1. 关闭防火墙 systemctl stop firewa ...
- 有趣html5(两)----使用canvas结合剧本画在画布上的简单图(html5另一个强大)
请珍惜劳动小编成果,这篇文章是原来小编,转载请注明出处. 于html5中能够使用canvas标签在画布上绘图,先直接上代码,这篇文章先简介一下canvas的用法.简单画几个圆,矩形,三角形,写字. 在 ...