本文討論的是模擬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是...