1.架構:就是系統(蘋果)或者第三方(其他的一些高手)事先寫好了一些很牛X功能的類.
把這些類交給我們使用.這些類的集合我們叫做架構.
架構中有很多很多功能相似的類.函數庫
Foundation架構: 是1個包這裡面有很多類、函數、定義了一些資料類型.
這個架構中的類都是一些最基礎的類. NSString NSObject
其他的架構都是基于Foundation架構的.
UIKit.
AVFoundation.
......
2. Foundation架構中的最常用的類.簡單的爆.量大.
3. NSString
1). NSString是1個資料類型.儲存OC字元串的.
NSString的本質是1個類.既然是1個類.
是以,最标準的建立NSString對象的方式:
NSString *str1 = [NSString new];
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [NSString string];
使用這種方式建立的字元串是1個空的字元. @""
NSString對象就是用來存儲字元串.
2). NSString是OC中最常用的1個類了.是以OC提供了一種更為快速的建立字元串對象的方式.
使用字首@
@"jack"; 本質上這是1個NSString對象.這個NSString對象中存儲的是"jack"這個字元串.
NSString *str1 = @"rose";
1). @"rose"本質上是1個NSString對象,這個對象中存儲的是字元串"rose".
2). 将這個字元串對象的位址傳回指派給str1指針.
格式控制符%p:列印指針變量的值.列印位址.
%@: 列印指針指向的對象.
4. NSString的恒定性.
1).當我們使用簡要的建立字元串對象的時候.也就是使用1個OC字元串常量來初始化字元串指針的時候.
這個字元串對象是存儲在常量區(資料段)的.
NSString *str = @"jack";
當我們調用NSString的類方法來建立對象的時候.
NSString *str = [NSString stringWithFormar:@"jack"];
NSString *str1 = [NSString new];
建立的字元串對象是存儲在堆區.
2).當在記憶體中建立1個字元串對象以後.這個字元串對象的内容就無法更改.
當我們重新為字元串指針初始化值的時候.并不是修改原來的字元串對象
而是重新的建立1個字元串對象将這個字元串對象的位址重新複制給字元串指針變量.
3).當系統準備要在記憶體中建立字元串對象的時候.會先檢查記憶體中是否有相同内容的字元串對象.
如果有,直接指向.如果沒有才會重新建立.
4).存儲在常量區的資料不會被回收.是以存儲在常量區的字元串對象也不會被回收.
5. NSString是1個類.那麼肯定其中有很多的方法.
6.使用頻率最最高的幾個方法.
1). 使用拼接的方式建立1個NSString對象.
+ (instancetype)stringWithFormat:(NSString *)format, ...
2). 得到字元串的長度.
@property (readonly) NSUInteger length;
3).得到字元串中指定下标的字元.
- (unichar)characterAtIndex:(NSUInteger)index;
傳回值是unichar類型的要列印的話使用%C
4).判斷兩個字元串的内容是否相同.
a. 能否使用 ==來判斷兩個OC字元串的内容是否相同.
b. ==運算符的作用:比較左右兩邊的資料是否相同.
-> 10 == 10 這個時候直接比較的是左右兩邊的資料是否相同.
-> a == b 兩邊也可以寫1個變量.這個時候比較是左右兩邊的變量的值是否相同.
-> 如果兩邊是1個指針變量.那麼比較的也是變量的值.隻不過指針變量的值是位址.
c.是以,如果我們要比較兩個OC字元串的内容是否相同.不能使用 == 去比較.
因為 ==比較的是字元串指針變量的值.而我們要比的是兩個字元串指針指向的字元串對象的内容是否相同.
c. 調用方法:
- (BOOL)isEqualToString:(NSString *)aString;
就可以比較目前字元串對象和傳入的字元串對象的内容是否相同.
5).将C語言的字元串轉換為OC字元串對象.
+ (instancetype)stringWithString:(NSString *)string;
6).将OC字元串對象轉換為C語言的字元串.
@property (nullable, readonly) __strong const char *UTF8String
7.将字元串寫入到指定的檔案中.
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
8.将檔案中的内容讀取到字元串中.
+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
nullable 代表傳回的對象有可能是nil
9. 使用NSURL讀寫資源.
1). NSURL對象.專門用來儲存資源位址的.資源位址:本地磁盤路徑、網頁位址、ftp檔案位址.
2). 資源路徑的位址的寫法:
http:// 開頭的是網頁路徑的寫法.
file:// 開頭的是本地磁盤的路徑
ftp:// 開頭的是ftp檔案資源的路徑
如果要講1個資源路徑的位址儲存到NSURL對象中位址一定要是标準寫法.
3). 如何将資源位址存儲到NSURL對象中.
NSURL *url1 = [NSURL URLWithString:@"http://www.itcast.cn"];
NSURL *url2 = [NSURL URLWithString:@"ftp://server.itcast.cn/ccc.txt"];
NSURL *url3 = [NSURL URLWithString:@"file:///Users/Apple/Desktop/abc.txt"];
4).字元串就提供了對應的方法去讀寫NSURL對象中封裝的資源路徑
從指定資源路徑讀取文本内容.
+ (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
将字元串的内容寫入到資源路徑中.
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
如果要向網頁或者ftp寫内容要有權限.
9. 字元串比較.
- (NSComparisonResult)compare:(NSString *)string;
10.字元串比較:忽略大小寫的比較:
11.字元串的相等判斷.
12.判斷字元串是否以指定的字元串開頭
- (BOOL)hasPrefix:(NSString *)str;
13.判斷字元串是否以指定的字元串結尾
- (BOOL)hasSuffix:(NSString *)str;
14.在主串中搜尋子串.從前往後
- (NSRange)rangeOfString:(NSString *)searchString;
傳回值是1個NSRange類型的結構體變量.
typedef struct _NSRange {
NSUInteger location;代表子串在主串出現的下标.
NSUInteger length;代表子串在主串中比對的長度.
} NSRange;
如果沒有找到:
location 為NSUInteger的最大值,也就是NSNotFound
length 的值為0
這個方法,是從前往後搜尋.第1次比對的子串.
15.在主串中搜尋子串.從後往前.
NSString *str = @"i love itcast love!";
NSRange range = [str rangeOfString:@"love" options:NSBackwardsSearch];
16. NSRange結構體.
1). 是Foundation架構中定義的1個結構體.
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
NSRange range;
這個結構體變量一般情況下用來表示1段範圍.特别用在子串在主串中的範圍表示.
@"hahajackhehe" @"jack"
4 4
NSRange range = {4, 4};
2).聲明并初始化結構體變量的方式.
1). 最原始的方式.
NSRange range;
range.location = 3;
range.length = 4;
2). 第二種方式: NSRange range = {3, 7};
3). 第三種方式: NSRange range = {.location = 3,.length = 7};
4). Foundation架構中定義了1個函數.這個函數可以快速的建立1個NSRange結構體會,
NSRange range = NSMakeRange(loc, len);
傳回1個指定屬性的NSRange結構體變量.
5). Foundation架構中定義了1個函數可以将1個NSRange結構體變量轉換為NSString
NSStringFromRange(ran)函數可以将NSRange結構體變量轉換為指定格式的字元串.
17. 字元串的截取.
取到字元串中的1部分.
- (NSString *)substringFromIndex:(NSUInteger)from;從指定的下标出一直截取到最後.
- (NSString *)substringToIndex:(NSUInteger)to;從第0個開始截取指定的個數.
- (NSString *)substringWithRange:(NSRange)range;截取指定的1段範圍.
18.字元串的替換
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
将字元串中第1個參數替換為第2個參數.友情提示:原來的指針指向字元串的内容是不會變的 會全部替換.
新串是以方法的傳回值傳回的.
這個方法還可以做删除.原理:将其替換為@""
19.字元串資料轉換為其他的類型.使用頻率很高.
@property (readonly) double doubleValue;
@property (readonly) float floatValue;
@property (readonly) int intValue;
@property (readonly) NSInteger integerValue
@property (readonly) long long longLongValue
@property (readonly) BOOL boolValue
轉換注意.從頭開始轉換,能轉換多少就是多少.到遇到不能轉換的時候就停止轉換.
20.去掉字元串前後的空格.
str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
中間的空格無法去掉.
21.字元串的恒定性.
一旦建立1個字元串對象,那麼這個字元串對象的内容就無法更改,當我們修改字元串的時候,其實是重新的建立了1個字元串對象.
代碼案例:
NSLog(@"-------------------");
NSString *str = @""; //@""
for(int i = 0; i < 50000; i++)
{
str = [NSString stringWithFormat:@"%@%d",str,i];
}
NSLog(@"-------------------");
會耗費很長的時間.每次循環的時候都會建立1個新的字元串對象.50000個,
因為字元串的恒定性.
22.如何讓這樣的大批量的字元串拼接可以更加快速的1點.
1).慢得原因:因為字元串的恒定性,每次修改字元串的時候,是重新的建立1個對象,
2).希望:有沒有一種對象是用來存儲字元串的,并且存儲在這個對象中的字元串資料可以更改.
23. NSMutableString
1). 是Foundation架構中的1個類.從NSString繼承.
是以,NSMutableString對象是用來存儲字元串資料的.
2). NSMutbaleString在父類NSString的基礎之上的做擴充.
存儲在NSSMutableString對象中的字元串資料可以更改.具備可變性.
直接可以改存儲在NSMutableStirng對象中的字元串資料,不會新建立對象.
24. NSMutableString的用法
1).既然是1個類,要使用的話,就得建立1個對象.
NSMutableString *str = [NSMutableString string];
2).往可變字元串對象中追加字元串.
- (void)appendString:(NSString *)aString; 直接追加内容.
- (void)appendFormat:(NSString *)format, ...以拼接的方式往可變字元串對象中追加内容.
3). 建立NSMutableString對象的時候,記住下面這樣的初始化方式是不行的.
NSMutableString *str = @"jack";
@"jack" 是1個NSString對象,是1個父類對象.
而str指針是1個NSMutableString類型的是1個子類類型的.
如果通過子類指針去調用子類獨有的成員就會運作錯誤.
4). NSMutableString從NSString繼承.
在使用NSString的地方完全可以使用NSMutableString
25. 使用NSMutableString來做大批量的字元串拼接.
NSLog(@"~~~~~~~~~~~~");
NSMutableString *str = [NSMutableString string];
for(int i = 0; i < 100000; i++)
{
[str appendFormat:@"%d",i];
}
NSLog(@"~~~~~~~~~~~~");
這個時候 "biu"的一下就結束了.為什麼這麼快>?因為NSMutableString隻有1個.每次修改的時候直接修改的是這個對象中的資料.
26. 使用建議
1). 我們平時使用的時候,還是使用NSString.因為效率高.
NSString *str1 = @"jack";
NSString *str2 = @"jack";
2). NSMutbaleString:隻在做大批量的字元串拼接的時候才使用.
大量拼接的時候,就不要去使用NSString因為效率低下.\
10次以上.