Objective-C---2---初始化、便利構造器

1. 繼承

繼承在OC中是單向

OC中只允許單繼承和C++不一樣

子類可以重寫父類的方法

聲明子類的setter和getter方法時,只要實現自己的成員變量即可,不用寫父類的,父類的已經封裝完成了,你直接調用就可以啦


基礎知識補充:

NSInteger 包括:int long short

創建一個對象,對象放在堆區   棧區存放變量

Person *per1 = [[Person alloc] init];

 對象:[[Person alloc] init]

per1:是指針

  [self 方法名];  
//  self出現在對象方法中,則指當前的對象,如果出現在類方法中,則指當前類
  NSLog(@"self = %@", [self class]);
//  可以查看現在的對象所屬的類是什麼

//  <strong>沒有創建對象時,通過super關鍵字調用父類方法</strong>



#pragma mark---------------------self這部分比較繞,可以仔細理解一下--------------

//  <strong>self:是誰調用的就是誰所屬的類:</strong>  以下是例子

/*  聲明一個Student和CollegeStudent類,CollegeStudent繼承於Student類
    在Student類中定義了一個sleep方法:
<pre name="code" class="objc">    CollegeStudent中沒有重寫sleep方法,只是單純的繼承
*/
- (void)sleep{
    NSLog(@"SLEEPING......");
    NSLog(@"self = %@", [self class]);

}

/* CollegeStudent *p = [CollegeStudent new];
[p sleep];
在sleep中的self的值:
*/
    NSLog(@"self = %@", [self class]);  //   ----------->中的self打印之後的結果:CollegeStudent
//   <strong>因爲是p調用的sleep,所以返回的是p的所屬類,不是sleep所在的類Student</strong>

2. 初始化

 1.  之前使用的初始化方法:

- (id)init{
    _name = @"李莫愁";
    _sex = @"女";
    return self;
}

//  也有這樣寫的初始化方法:
- (id)init{
    self = [super init];
        _name = @"黃蓉";
    return self;
}


- (id)init{
  self = [super init];  //   調用父類的初始化方法,將繼承下來的變量進行初始化
    if (self != nil) {
       //  初始化方法
        _name = @"小龍女";
        _sex = @"女";
        
    }
    return self;
}


2. 完整的初始化方法:

- (id)init{
    self = [super init];  //   調用父類的初始化方法,將繼承下來的變量進行初始化
    if (self) {
        //  初始化設置
        _name = @"滅絕師太";
        _sex = @"女";
        
    }
    return self;   //  返回初始化完成的self
}


 3.  self:如同指針

在動態方法中(-方法/對象方法):self代表對象

在靜態方法中(+方法/類方法):self代表類

[super init]:發送消息,要調用父類初始化方法,然後返回給子類

- (id)initWithName:(NSString *)name
               Sex:(NSString *)sex
               Age:(NSInteger)age{
    self = [super init];
    if (self) {
        _name = name;
        _sex = sex;
        _age = age;
        
        //  下面兩個NSLog打印出來的  只是測試一下
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%s",__FUNCTION__);
    }
    return self;
}


打印的結果:

Person
-[Person initWithName:Sex:Age:]

id和instancetype用起來一樣

 

3. 便利構造器:

+ (Person *)personWithName:(NSString *)name
                       Age:(NSInteger)age
                       Sex:(NSString *)sex{
    // 便利構造器內部創建對象
    //  便利構造器已經創建了對象,直接調用就可以了,不用再創建新的啦
    Person *p = [[[Person alloc] initWithName:name Sex:sex Age:age] autorelease];
    return p;
}

//  main函數中調用時:不用alloc或new創建
Person *p = [Person personWithName:@"夏目" Age:16 Sex:@"男"];


 

   析構函數:

- (void)dealloc{
[super dealloc];
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章