標籤:objective 方法 initwithformat
初始化 之 便利初始化和指定初始化便利初始化方式便利初始化方式一
-(id) initWithFormat:(NSString *) format,...;
- 初始化了一個新的字串作為格式化操作的結果. 下面就是一個小例子
//按格式返回字串NSString *myString = [[NSString alloc] initWithFormat:@"myString has %dletter",8]; NSLog(@"%@",myString);
其結果是列印出一句話: myString has 8 letter
便利初始化方式二
* -(id) initWithContentOfFile:(NSString*) path encoding:(NSStringEncoding) enc error:(NSError**)error
- 功能是利用讀取檔案內容來初始化,初始化一個字串對象
- encoding 用於說明檔案的編碼格式,比如 GBK UTF8等,一般來說沒有特殊情況,使用NSUTF8StringEncoding.
- error 參數如果正常初始化了,則返回 nil, 否則返回錯誤資訊,這些資訊封裝成 NSError 對象,可以使用%@格式符列印出來,也可以使用 NSError 的對象方法: localizedDescription 列印錯誤資訊.
- 注意: error 是指標的指標
下面是一個利用開啟檔案並且讀取檔案內容初始化的例子:
NSError *error = nil; NSString *fileContent = [NSString stringWithContentsOfFile:@"/Users/qingyun/ Desktop/anotherTest.txt" encoding:NSUTF8StringEncoding error:&error];NSString *fileContent = [[NSString alloc] initWithContentsOfFile:@"/Users/ qingyun/Desktop/anotherTest.txt" encoding:NSUTF8StringEncoding error:&error]; // error 是指標的指標 if (nil != error) { NSLog(@"%@",error); exit(1); }NSLog(@"File content:%@",fileContent);
指定初始化方式便利建構函式的缺點
在子類化的時候,為了保證父類能正常初始化,就需要重寫父類所有的初始化方法和便利初始化方法,並添加子類成員變數的初始,這樣就會導致,當父類修改或者添加初始化方法的時候,子類需要做相應的修改。這樣的設計偏離了高內聚低耦合的設計原則。
指定初始化函數
類中的某個初始化方法被指派為指定初始化函數,該類的所有初始化方法都使用指定初始化方法執行初始化操作.而子類使用其超類的指定初始化方法進行超類的初始化.
一般情況下,接收參數最多的初始化方法是最終的指定初始化方法,因為它的初始化資訊比較全面.因此,對於子類來說,只要重寫父類的指定初始化方法,就可以解決便利初始化方法的缺點.
下面舉一個例子,構建一個 QYTire 的類,它有兩個成員變數,壓力和花紋,還有一些對應的方法,在其對應的標頭檔(. h) 中,代碼如下:
#import <Foundation/Foundation.h>@interface QYTire : NSObject//{// float myTirePresure;//}@property float pressure;@property float treadth;- (id)initWithPressure:(float)pressure;- (id)initWithTreadth:(float)treadth;- (id)initWithPressure:(float)pressure andTreadth:(float)treadth;@end
在實現檔案中,代碼如下:
- (id)init{ self = [self initWithPressure:30.5f andTreadth:20.6f]; if (self) { } return self;}- (id)initWithPressure:(float)p{ self = [self initWithPressure:p andTreadth:20.6f]; if (self) { } return self;}- (id)initWithTreadth:(float)t{ self = [self initWithPressure:30.5f andTreadth:t]; if (self) { } return self;}//指定初始化方法- (id)initWithPressure:(float)p andTreadth:(float)t{ self = [super init]; if (self) { self.pressure= p; _treadth = t; } return self;}
建立一個子類 AllWeatherTire,繼承於 QYTire,由於它繼承了超類中的方法,當其在子類中要使用這些方法時,要重寫這些方法.如果使用指定初始化方法時,當父類方法出現變動時,只需要重寫子類中的指定初始化方法即可.
//標頭檔AllWeatherTire.h#import "QYTire.h"@interface AllWeatherTire : QYTire//{// float rainHanding;// //}@property float rainHanding;@property float snowHanding;- (id)initWithRainHanding:(float)rainHanding;- (id)initWithSnowHanding:(float)snowHanding;@end//實現檔案AllWeatherTire.m#import "AllWeatherTire.h"@implementation AllWeatherTire- (id)initWithPressure:(float)p andTreadth:(float)t{ self = [super initWithPressure:p andTreadth:t]; if (self) { self.snowHanding = 300.2f; self.rainHanding = 200.3f; } return self;}- (id)initWithSnowHanding:(float)s{ self = [self initWithSnowHanding:s andRainHanding:200.3f]; if (self) { } return self;}- (id)initWithRainHanding:(float)r{ self = [self initWithSnowHanding:300.2f andRainHanding:r ]; if (self) { } return self;}// 子類的也可以使用指定初始化方式- (id)initWithSnowHanding:(float)s andRainHanding:(float)r{ self = [super init]; if (self) { self.snowHanding = s; self.rainHanding = r; } return self;}- (NSString *)description{ return [NSString stringWithFormat:@"%.1f,%.1f,%.1f,%.1f", [self pressure] ,[self treadth],self.rainHanding,self.snowHanding];}@end
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Objective-C 中便利初始化方法和指定初始化方法