OC字串NSString類的模擬

2021-06-23 05:58:07 字數 3249 閱讀 8794

本文討論的是模擬nsstring類封裝乙個自定義的字串類,下圖是完成部分功能封裝的結果

ocfoundation框架中的重要組成部分,是oc的字串類,它可以將c中的字串轉換成乙個物件.下面是最簡單的建立物件的一句**:用字串常量建立

nsstring *string1 = @"字串常量";
這裡的@符號是oc中的關鍵字,但是我猜測它是乙個運算子或者是乙個特別的函式,因為string1是乙個nsstring類的指標,指標了堆記憶體中的字串物件,那麼@"字串常量"必定要返回乙個同類的指標,這一點可以在xcode得到驗證,如下圖

我猜測nsstring類是至少有乙個字串陣列或者字元指標成員變數,它儲存或者指向@"string"中的"string",要不然在nslog輸出字串時沒法找到字串,比如

nslog(@"%@ %p %p", string1, string1, @"字串常量");
既然string1只是乙個nsstring*指標,指向的是堆記憶體的乙個位址,它不是字串,那麼nslog函式內部必定呼叫了string1的某個方法返回了其中的字串成員變數. 另外注意這裡的兩個%p 它們列印的位址是一樣的,這說明它們指向的是同乙個位址,也就是說@""確實返回了乙個nsstring* 指標

下面我們來討論封裝模擬nsstring類的第一步,做乙個自己的@""函式,因為它是oc字串物件建立的開始,讓它返回我們需要的指標型別!

一、自定義@""

    1

➢自定義oc字串類shstring

先寫乙個shstring類,有乙個成員變數:如下

//

// shstring.m

// oc字串

//// created by mac on 14-8-16.

//#import "shstring.h"

@inte***ce shstring ()

// 私有方法

- (void)_setstring_:(unichar *)string;

- (unichar *)str_ing_;

@end

@implementation shstring

// 私有set方法

- (void)_setstring_:(unichar *)string

// 私有get方法

- (unichar *)str_ing_

- (id)init

return self;

}@end

這裡的兩個私有方法是setter和getter方法,由於oc是弱語法,沒有真正的私有方法,所以這裡的方法名盡量寫得不正常,以免使用者呼叫到. 2

➢模擬@""

由於我們無法以@""來寫函式,這裡我們可以用巨集來曲線救國,新建乙個.m和.h檔案,.h檔案內容如下:

//  operator.h

// oc字串

// created by mac on 14-8-16.

//#ifndef oc____operator_h

#define oc____operator_h

#import "shstring.h"

shstring *func(const char *cstring); // 模擬@""的函式

#define $(a) func(a) // 將函式名用$()巨集代替

#endif

這樣我們就可以用 $("string") 來模擬 @"string"  表示式,而且返回乙個我們自定義類shstring的指標,等於是建立乙個字串物件,下面

是.m檔案內容

//

// operator.c

// oc字串

//// created by mac on 14-8-16.

//#import "operator.h"

#import #undef setstring

// 取消sel的警告

#pragma clang diagnostic push

#pragma clang diagnostic ignored "-warc-performselector-leaks"

shstring *func(const char *cstring)

當呼叫上面的func函式,就會有一塊堆記憶體開闢給_string指向它,並且拷貝乙份字串到其中的 _string中,然後返回這塊記憶體的首位址(shstring* 指標). 於是,我們就可以寫出這樣的**

shstring *string = $("hello");
建立乙個自定義的字串物件,但是我們無法列印,因為nslog內部不可能有解析列印shstring類中的字串的功能,它的%@只是指標nsstring的,我們傳乙個shstring*的指標,肯定無法輸出字串.

這裡有兩個辦法:1> 再次自定義乙個nslog的函式,但是這不太現實,牽扯到封裝字串之外的事,當然也可以只定義乙個列印shstring類的函式,就比較.

2> 重寫desciption方法,它是與nslog函式的介面

這裡為了簡便,選擇第二種

在shstring.m中重寫該方法

// 重寫description方法

- (nsstring *)description

return @"";

}

至此,我們已經可以用$()來建立乙個字串物件並用nslog列印了,如:

//

// main.m

// 部落格

最後為了安全可以將setter方法和getter方法方法名做個巨集,如果還是有使用者找到了方法名,也可以讓呼叫失敗.

NSString字串擷取

1.擷取字串一部分 substringwithrange nsrange nsstring a 01234567890 nsstring b a substringwithrange nsmakerange 0,2 b 01 2.字串擷取到第n位 substringtoindex n 第n位不在擷取...

iphone 字串 nsstring用法

1.4.1 字串 可能最常使用的類就是nsstring。nsstring是不可變的,這意味著一旦建立了它,就不能修改它。如果需要修改乙個nsstring的內容,應該使用nsmutablestring類。然而,直接用新的內容建立乙個新的nsstring,這種做法更為常見。有很多種方法可以建立乙個nss...

NSString字串與陣列

1.建立乙個普通字串 nsstring str abc 不可變字串 nsmtablestring str1 nsmtablestring string 可變字串 不可變字串 生成的物件都是不可變的字串物件。比如string iphone 如果想獲得 ip 只能生成新的字串 ip nsmutable是...