1祷膳、先把OC的類分清楚各友善么方法
普通類的方法
init
initialize:
控制器類的方法
init
initialize:
initWithCoder:
UI控件類的方法
init
initialize:
initWithCoder:
initWithFrame:
2陶衅、init方法
每個類被創(chuàng)建的時候就會調(diào)用init方法
Person *p1 = [[Person alloc]init];
Person *p2 = [[Person alloc]init];
Person *p3 = [[Person alloc]init];
Person *p4 = [[Person alloc]init];
打印信息
2015-10-14 10:42:58.852 afgasdgsdfsd[856:19063] Person---init---Person
2015-10-14 10:42:58.852 afgasdgsdfsd[856:19063] Person---init---Person
2015-10-14 10:42:58.853 afgasdgsdfsd[856:19063] Person---init---Person
2015-10-14 10:42:58.853 afgasdgsdfsd[856:19063] Person---init---Person
在有繼承關(guān)系的情況下,比如Student類繼承Person類直晨,那么在不重寫子類的init方法時搀军,創(chuàng)建子類對象
Person *p1 = [[Person alloc]init];
Person *p2 = [[Person alloc]init];
Person *p3 = [[Person alloc]init];
Person *p4 = [[Person alloc]init];
Student *s = [[Student alloc] init];
- (instancetype)init{
if (self = [super init]) {
NSLog(@"Person---init---%@",[self class]);
}
return self;
}
打印信息
2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Student
我們可以看到再一次調(diào)用了父類的init,因為父類幫子類創(chuàng)建了對象勇皇。
如果子類重寫了init方法罩句,也會先調(diào)用父類的init。
3敛摘、initialize:
這個類跟init經(jīng)趁爬茫混淆,但是還是有區(qū)別的,我們先看看調(diào)用的書序
#import "Person.h"
@implementation Person
- (instancetype)init{
if (self = [super init]) {
NSLog(@"Person---init---%@",[self class]);
}
return self;
}
+ (void)initialize{
if ( self == [Person class]) {
NSLog(@"Person----initialize---%@",[self class]);
}
}
@end
打印信息
2015-10-14 11:00:43.568 afgasdgsdfsd[904:22876] Person----initialize---Person
2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
我們可以看到先打印initialize:方法屯远,而且只打印的一次蔓姚,為什么呢?
在程序運行過程中慨丐,它會在你程序中每個類調(diào)用一次initialize坡脐。這個調(diào)用的時間發(fā)生在你的類接收到消息之前,但是在它的超類接收到initialize之后咖气。
系統(tǒng)在第一次使用這個類的時候調(diào)用(一個類只會調(diào)用一次)
如果在有繼承關(guān)系的情況下有三種
一挨措、父類重寫:只有父類調(diào)用
二、子類重寫:只有子類調(diào)用
三崩溪、父子類重寫:父子類調(diào)用
#import "Person.h"
@implementation Person
- (instancetype)init{
if (self = [super init]) {
NSLog(@"Person---init---%@",[self class]);
}
return self;
}
+ (void)initialize{
if ( self == [Person class]) {
NSLog(@"Person----initialize---%@",[self class]);
}
}
@end
Alex 2015/10/14 11:17:25
#import "Student.h"
@implementation Student
- (instancetype)init{
if (self = [super init]) {
NSLog(@"Student---init");
}
return self;
}
+ (void)initialize{
if ( self == [Student class]) {
NSLog(@"Student----initialize---%@",[self class]);
}
}
@end
Person *p1 = [[Person alloc]init];
Person *p2 = [[Person alloc]init];
Student *s = [[Student alloc] init];
2015-10-14 11:17:54.500 afgasdgsdfsd[970:26330] Person----initialize---Person
2015-10-14 11:17:54.501 afgasdgsdfsd[970:26330] Person---init---Person
2015-10-14 11:17:54.501 afgasdgsdfsd[970:26330] Person---init---Person
2015-10-14 11:17:54.501 afgasdgsdfsd[970:26330] Student----initialize---Student
2015-10-14 11:17:54.502 afgasdgsdfsd[970:26330] Person---init---Student
2015-10-14 11:17:54.502 afgasdgsdfsd[970:26330] Student---init
4浅役、initWithCoder:
這個方法時遵守了NSCoding協(xié)議 作用:通過xib或者storyboard創(chuàng)建UI控件就會調(diào)用這個方法
5、initWithFrame:
一般創(chuàng)建UI對象有兩種方式伶唯。
一種是通過nib觉既,一種是通過代碼。
如果是通過代碼創(chuàng)建乳幸,那么就會調(diào)用這個方法瞪讼,進行frame的部署,還有控件的創(chuàng)建粹断。但是在這個方法中創(chuàng)建控件并且設(shè)置尺寸的話符欠,你會發(fā)現(xiàn)UI控件不會顯示。為什么呢瓶埋?因為initWithFrame:調(diào)用時希柿,frame是0,沒有尺寸的养筒,所以根據(jù)這個frame設(shè)置UI控件的frame自然也為空曾撤。一般在這個方法中初始化UI控件。在layoutSubviews方法設(shè)置UI控件的frame晕粪。
/**
* 通過代碼創(chuàng)建控件的時候就會調(diào)用
*/
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
// 初始化UI控件
}
return self;
}
/**
* UI控件重新部署
*/
- (void)layoutSubviews{
[super layoutSubviews];
// 設(shè)置UI控件的frame
}