1. 程式人生 > >ios物件初始化以及初始化方法

ios物件初始化以及初始化方法

1、所有的類呼叫alloc方法來分配記憶體

2、init方法完成初始化

init方法雖然 可以完成初始化,但是由於它是完成最基本的初始化,因此,物件的所有成員變數依然是0;

一、我們可以重寫初始化方法:init

NSObject提供的初始化時最基本的初始化,因此,物件的所有成員變數都為0;

我們在實際的變成過程中,可以提供自己的init方法,這個方法實際上就是重寫NSObiect的init方法,當我們重寫init方法時,我們可以加入任意的自定義的處理程式碼對屬性執行初始化。

如下:

程式程式碼:LYXUser.h

//
//  LYXUser.h
//  物件初始化練習

#import <Foundation/Foundation.h>

@interface LYXUser : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)int age;
@property(nonatomic,copy)NSString *address;
@end
程式程式碼:LYXUser.m
//
//  LYXUser.m
//  物件初始化練習

#import "LYXUser.h"

@implementation LYXUser
@synthesize name;
@synthesize age;
@synthesize address;

-(id)init
{
    //呼叫父類的init方法進行初始化,將初始化得到的物件賦值給self物件
    //如果self物件不為nil,表明父類init方法初始化成功
    if (self = [super init]) {
        self.name = @"猴年宋小寶";
        self.age = 400;
        self.address = @"中國大連";
    }
    return self;
}
@end

程式程式碼:main.m
//
//  main.m
//  物件初始化練習
//

#import <Foundation/Foundation.h>
#import "LYXUser.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        LYXUser *user = [[LYXUser alloc]init];
        NSLog(@"使用者的名字是:%@",user.name);
        NSLog(@"使用者的年齡為:%d",user.age);
        NSLog(@"使用者的住址為:%@",user.address);
    }
    return 0;
}

上方程式碼 LYXUser *user = [[LYXUser alloc]init];會為LYXUser物件分配記憶體空間,並呼叫init方法執行初始化,只是這個init方法不是NSObject提供的,而是上方的LYXUser.m檔案提供的,這樣就可以使新生成的LYXUser物件已經被賦值


輸出:
2016-02-14 09:13:28.415 物件初始化練習[2735:198404] 使用者的名字是:猴年宋小寶
2016-02-14 09:13:28.416 物件初始化練習[2735:198404] 使用者的年齡為:400
2016-02-14 09:13:28.416 物件初始化練習[2735:198404] 使用者的住址為:中國大連
Program ended with exit code: 0
當我們重寫初始化方法時,大致上總滿足如下模板:
-(id)init
{
    //呼叫父類的init方法進行初始化,將初始化得到的物件賦值給self物件
    //如果self物件不為nil,表明父類init方法初始化成功
    if (self = [super init]) {
        //執行初始化
    }
    return self;
}


二、便利的初始化方法

由於系統的初始化方法總是固定的,所以我們可以根據業務需要,為其提供更多的便利的初始化方法,這些方法通常是init開頭,並允許帶一些引數。

程式程式碼:LYXUser.h

//
//  LYXUser.h
//  物件初始化練習

#import <Foundation/Foundation.h>

@interface LYXUser : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)int age;
@property(nonatomic,copy)NSString *address;

-(id)initWithName:(NSString *)name age:(int)age;
-(id)initWithName:(NSString *)name age:(int)age address:(NSString *)address;

@end


程式程式碼:LYXUser.m

//
//  LYXUser.m
//  物件初始化練習

#import "LYXUser.h"

@implementation LYXUser
@synthesize name = _name;
@synthesize age = _age;
@synthesize address = _address;

-(id)init
{
    //呼叫父類的init方法進行初始化,將初始化得到的物件賦值給self物件
    //如果self物件不為nil,表明父類init方法初始化成功
    if (self = [super init]) {
        //對該物件進行賦初始值
        self.name = @"猴年宋小寶";
        self.age = 400;
        self.address = @"中國大連";
    }
    return self;
}
//實現下方方法,完成自定義初始化
-(id)initWithName:(NSString *)name age:(int)age
{
    //呼叫父類的init方法進行初始化,將初始化得到的物件賦值給self物件
    //如果self物件不為nil,表明父類init方法初始化成功
    <strong>if (self = [super init]) {
        //對該物件進行賦初始值
        self.name = name;
        self.age = 10;
        self.address = @"中國呼和浩特";</strong>
    }
    return self;
}
//實現下方方法,完成自定義初始化
-(id)initWithName:(NSString *)name age:(int)age address:(NSString *)address
{
    //呼叫本類的initWithName: age:方法進行初始化,將初始化得到的物件賦值給self物件
    //如果self物件不為nil,表明initWithName: age:方法初始化成功
    <strong>if (self = [self initWithName:name age:age]) {
        //對該物件的address進行賦值
        self.address = address;
    }</strong>
    return self;
}
@end

上方第一段程式的粗體字滿足前面寫的初始化方法,首先呼叫父類init方法執行預設初始化,然後判斷初始化的物件不為nil時,程式會根據傳入的引數對物件進行賦值。

粗體字就是/strong中間的字

第二段程式碼中的黑體字我們看上不不像前方我寫的初始化方法的模板,這是因為當前類中已經有了初始化兩個屬性的方法,所以程式首先呼叫當前的另一個初始化方法執行初始化,然後判斷初始化得到的物件是否為nil ,如果不為nil,程式會再次根據傳入的address屬性賦值,從程式碼可以看出,上面第三個初始化方法直接複用了第二個初始化方法,因此,可以提供更好的程式碼複用。

程式可以在建立物件是立即初始化物件的屬性,避免物件建立完成後還要通過呼叫物件的setter方法來設定物件的屬性值。

程式程式碼:main.m

//
//  main.m
//  物件初始化練習
//

#import <Foundation/Foundation.h>
#import "LYXUser.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        LYXUser *user1 = [[LYXUser alloc]init];
        NSLog(@"使用者的名字是:%@",user1.name);
        NSLog(@"使用者的年齡為:%d",user1.age);
        NSLog(@"使用者的住址為:%@",user1.address);
        LYXUser *user2 = [[LYXUser alloc]initWithName:@"習近平" age:@(49)];
        NSLog(@"使用者的名字是:%@",user2.name);
        NSLog(@"使用者的年齡為:%d",user2.age);
        NSLog(@"使用者的住址為:%@",user2.address);
        LYXUser *user3 = [[LYXUser alloc]initWithName:@"毛澤東" age:99 address:@"陝西延安"];
        NSLog(@"使用者的名字是:%@",user3.name);
        NSLog(@"使用者的年齡為:%d",user3.age);
        NSLog(@"使用者的住址為:%@",user3.address);


    }
    return 0;
}

輸出我們可以看到:
2016-02-14 09:38:24.366 物件初始化練習[2767:296433] 使用者的名字是:猴年宋小寶
2016-02-14 09:38:24.366 物件初始化練習[2767:296433] 使用者的年齡為:400
2016-02-14 09:38:24.366 物件初始化練習[2767:296433] 使用者的住址為:中國大連
2016-02-14 09:38:24.366 物件初始化練習[2767:296433] 使用者的名字是:習近平
2016-02-14 09:38:24.367 物件初始化練習[2767:296433] 使用者的年齡為:10
2016-02-14 09:38:24.367 物件初始化練習[2767:296433] 使用者的住址為:中國呼和浩特
2016-02-14 09:38:24.367 物件初始化練習[2767:296433] 使用者的名字是:毛澤東
2016-02-14 09:38:24.367 物件初始化練習[2767:296433] 使用者的年齡為:10
2016-02-14 09:38:24.367 物件初始化練習[2767:296433] 使用者的住址為:陝西延安
Program ended with exit code: 0