OC语言之Protocol基本使用
# Protocol基本概念
##1.protocol 基本概念
- Protocol翻譯過來, 叫做”協(xié)議”
??? +在寫java的時候都會有接口interface這個概念,接口就是一堆方法的聲明沒有實現(xiàn),而在OC里面Interface是一個類的頭文件的聲明,并不是真正意義上的接口的意思,在OC中接口是由一個叫做協(xié)議的protocol來實現(xiàn)的
??? +protocol它可以聲明一些必須實現(xiàn)的方法和選擇實現(xiàn)的方法。這個和java是完全不同的
- Protocol的作用
??? +用來聲明一些方法
??? +也就說, 一個Protocol是由一系列的方法聲明組成的
---
##2.protocol 語法格式
- Protocol的定義
```
@protocol 協(xié)議名稱
// 方法聲明列表
@end
```
- 類遵守協(xié)議
??? +一個類可以遵守1個或多個協(xié)議
??? +任何類只要遵守了Protocol,就相當于擁有了Protocol的所有方法聲明
```
@interface 類名 : 父類 <協(xié)議名稱1, 協(xié)議名稱2,…>
@end
```
- 示例
```
@protocol SportProtocol <NSObject>
- (void)playFootball;
- (void)playBasketball;
@end
#import "SportProtocol.h" // 導入?yún)f(xié)議
@interface Studnet :NSObject<SportProtocol> // 遵守協(xié)議
@end
?
@implementation Student
// 實現(xiàn)協(xié)議方法
- (void)playBasketball
{
???NSLog(@"%s", __func__);
}
// 實現(xiàn)協(xié)議方法
- (void)playFootball
{
???NSLog(@"%s", __func__);
}
@end
```
##3.protocol和繼承區(qū)別
- 繼承之后默認就有實現(xiàn), 而protocol只有聲明沒有實現(xiàn)
- 相同類型的類可以使用繼承, 但是不同類型的類只能使用protocol
- protocol可以用于存儲方法的聲明, 可以將多個類中共同的方法抽取出來, 以后讓這些類遵守協(xié)議即可
---
# Protocol類型限制
##1.protocol類型限制
- 設定情景:
??? +某攻城獅A希望找一個會做飯、洗衣服的女生做女朋友,有國企工作的優(yōu)先。
??? +滿足條件的女生都可以向他發(fā)送消息
?
- 從題目中我們得到要求
??? +會做飯
??? +會洗衣服
??? +有份好工作
```
@protocol WifeCondition<NSObject>
- (void)cooking;
- (void)washing;
- (void)job;
@end
```
- 如何在代碼中要求對象必須具備這些行為?
??? +數(shù)據(jù)類型<協(xié)議名稱> 變量名
```
// 如果沒有遵守協(xié)議則會報警告
id<WifeCondition> wife = [[Personalloc] init];
```
# 代理設計模式
##1.
- 什么是設計模式
??? +設計模式(Design pattern)是一套被反復使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設計經(jīng)驗的總結(jié)。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無疑問,設計模式于己于他人于系統(tǒng)都是多贏的;設計模式使代碼編制真正工程化;設計模式是軟件工程的基石脈絡,如同大廈的結(jié)構(gòu)一樣。
- 什么是代理設計模式
??? +生活中大家一定遇到這樣的情況了:比如說我要買一包紙,不妨就是心相印的吧,那一般人的話我應該不是去心相印的工廠里面直接去買吧,而是我們在心相印專賣店或者什么超市啊,這些地方購買,這些地方實際上就是潔麗雅毛巾的代理。這其實和我們OO中的代理模式是很相似的。
?
- 代理設計模式的場合:
??? +當對象A發(fā)生了一些行為,想告知對象B(讓對象B成為對象A的代理對象)
??? +對象B想監(jiān)聽對象A的一些行為(讓對象B成為對象A的代理對象)
??? +當對象A無法處理某些行為的時候,想讓對象B幫忙處理(讓對象B成為對象A的代理對象)
---
##2.代理設計模式示例
- 嬰兒吃飯睡覺
```
// 協(xié)議
#import <Foundation/Foundation.h>
@class Baby;
?
@protocol BabyProtocol <NSObject>
- (void)feedWithBaby:(Baby *)baby;
- (void)hypnosisWithBaby:(Baby *)baby;
@end
```
#import "BabyProtocol.h"
@interface Baby : NSObject
// 食量
@property (nonatomic, assign) int food;
// 睡意
@property (nonatomic, assign) intdrowsiness;
// 餓
- (void)hungry;
// 睡意
- (void)sleepy;
@property (nonatomic, strong)id<BabyProtocol> nanny;
@end
?
@implementation Baby
?
- (void)hungry
{
???self.food -= 5;
???NSLog(@"嬰兒餓了");
???// 通知保姆
???if ([self.nanny respondsToSelector:@selector(feedWithBaby:)]) {
???????[self.nanny feedWithBaby:self];
??? }
}
?
- (void)sleepy
{
???self.drowsiness += 5;
???NSLog(@"嬰兒困了");
???// 通知保姆
???if ([self.nanny respondsToSelector:@selector(hypnosisWithBaby:)]) {
???????[self.nanny hypnosisWithBaby:self];
??? }
}
@end
```
// 保姆
@interface Nanny : NSObject<BabyProtocol>
@end
?
@implementation Nanny
- (void)feedWithBaby:(Baby *)baby
{
???baby.food += 10;
???NSLog(@"給嬰兒喂奶, 現(xiàn)在的食量是%i", baby.food);
}
?
- (void)hypnosisWithBaby:(Baby *)baby
{
???baby.drowsiness += 10;
???NSLog(@"哄嬰兒睡覺, 現(xiàn)在的睡意是%i", baby.drowsiness);
}
@end
```
- 有一個嬰兒,他本身不會自己吃飯和洗澡等等一些事情,于是嬰兒就請了一個保姆,于是嬰兒和保姆之間商定了一個協(xié)議,協(xié)議中寫明了保姆需要做什么事情,而保姆就是這個代理人,即:嬰兒和保姆之間有個協(xié)議,保姆遵守該協(xié)議,于是保姆就需要實現(xiàn)該協(xié)議中的條款成為代理人
---
##3.代理設計模式練習
- 學生通過中介找房子的過程,學生不知道怎么找所以讓代理幫忙找
# 代理設計模式
##1.
- 什么是設計模式
??? +設計模式(Design pattern)是一套被反復使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設計經(jīng)驗的總結(jié)。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無疑問,設計模式于己于他人于系統(tǒng)都是多贏的;設計模式使代碼編制真正工程化;設計模式是軟件工程的基石脈絡,如同大廈的結(jié)構(gòu)一樣。
?
- 什么是代理設計模式
??? +生活中大家一定遇到這樣的情況了:比如說我要買一包紙,不妨就是心相印的吧,那一般人的話我應該不是去心相印的工廠里面直接去買吧,而是我們在心相印專賣店或者什么超市啊,這些地方購買,這些地方實際上就是潔麗雅毛巾的代理。這其實和我們OO中的代理模式是很相似的。
?
- 代理設計模式的場合:
??? +當對象A發(fā)生了一些行為,想告知對象B(讓對象B成為對象A的代理對象)
??? +對象B想監(jiān)聽對象A的一些行為(讓對象B成為對象A的代理對象)
??? +當對象A無法處理某些行為的時候,想讓對象B幫忙處理(讓對象B成為對象A的代理對象)
---
##2.代理設計模式示例
- 嬰兒吃飯睡覺
```
// 協(xié)議
#import <Foundation/Foundation.h>
@class Baby;
?
@protocol BabyProtocol <NSObject>
- (void)feedWithBaby:(Baby *)baby;
- (void)hypnosisWithBaby:(Baby *)baby;
@end
```
#import "BabyProtocol.h"
@interface Baby : NSObject
// 食量
@property (nonatomic, assign) int food;
// 睡意
@property (nonatomic, assign) intdrowsiness;
// 餓
- (void)hungry;
// 睡意
- (void)sleepy;
@property (nonatomic, strong)id<BabyProtocol> nanny;
@end
?
@implementation Baby
?
- (void)hungry
{
???self.food -= 5;
???NSLog(@"嬰兒餓了");
???// 通知保姆
???if ([self.nanny respondsToSelector:@selector(feedWithBaby:)]) {
???????[self.nanny feedWithBaby:self];
??? }
}
?
- (void)sleepy
{
???self.drowsiness += 5;
???NSLog(@"嬰兒困了");
???// 通知保姆
???if ([self.nanny respondsToSelector:@selector(hypnosisWithBaby:)]) {
???????[self.nanny hypnosisWithBaby:self];
??? }
}
@end
```
// 保姆
@interface Nanny : NSObject<BabyProtocol>
@end
?
@implementation Nanny
?
- (void)feedWithBaby:(Baby *)baby
{
???baby.food += 10;
???NSLog(@"給嬰兒喂奶, 現(xiàn)在的食量是%i", baby.food);
}
?
- (void)hypnosisWithBaby:(Baby *)baby
{
???baby.drowsiness += 10;
???NSLog(@"哄嬰兒睡覺, 現(xiàn)在的睡意是%i", baby.drowsiness);
}
@end
```
- 有一個嬰兒,他本身不會自己吃飯和洗澡等等一些事情,于是嬰兒就請了一個保姆,于是嬰兒和保姆之間商定了一個協(xié)議,協(xié)議中寫明了保姆需要做什么事情,而保姆就是這個代理人,即:嬰兒和保姆之間有個協(xié)議,保姆遵守該協(xié)議,于是保姆就需要實現(xiàn)該協(xié)議中的條款成為代理人
---
##3.代理設計模式練習
- 學生通過中介找房子的過程,學生不知道怎么找所以讓代理幫忙找
?
# 字符串讀寫
##1.直接讀寫文件中的字符
- 從文件中讀取
```
// 用來保存錯誤信息
NSError *error = nil;
// 讀取文件內(nèi)容
NSString *str = [NSStringstringWithContentsOfFile:@"/Users/LNJ/Desktop/lnj.txt"encoding:NSUTF8StringEncoding error:&error];
// 如果有錯誤信息
if (error) {
???NSLog(@"讀取失敗, 錯誤原因是:%@", [error localizedDescription]);
} else { // 如果沒有錯誤信息
???NSLog(@"讀取成功, 文件內(nèi)容是:\n%@", str);
}
```
- 寫入文件中
```
NSString *str = @"江哥";
BOOL flag = [strwriteToFile:@"/Users/LNJ/Desktop/lnj.txt" atomically:YESencoding:NSUTF8StringEncoding error:nil];
if (flag == 1)
{
???NSLog(@"寫入成功");
}
```
- 重復寫入同一文件會覆蓋掉上一次的內(nèi)容
?
```
NSString *str1 = @"江哥";
BOOL flag = [str1writeToFile:@"/Users/LNJ/Desktop/lnj.txt" atomically:YESencoding:NSUTF8StringEncoding error:nil];
?
NSString *str2 = @"南哥";
[str2writeToFile:@"/Users/LNJ/Desktop/lnj.txt" atomically:YESencoding:NSUTF8StringEncoding error:nil];
?
NSString *str = [NSStringstringWithContentsOfFile:@"/Users/LNJ/Desktop/lnj.txt"encoding:NSUTF8StringEncoding error:&error];
NSLog(@"str = %@", str);
?
輸出結(jié)果:南哥
---
##2.NSURL簡介
- 什么是URL
??? +URL的全稱是Uniform Resource Locator(統(tǒng)一資源定位符)
??? +URL是互聯(lián)網(wǎng)上標準資源的地址
? ??+ 互聯(lián)網(wǎng)上的每個資源都有一個唯一的URL,它包含的信息指出資源的位置
??? +根據(jù)一個URL就能找到唯一的一個資源
?
- URL的格式
??? +基本URL包含協(xié)議、主機域名(服務器名稱\IP地址)、路徑
??? +舉例: http://www.520it.com/ios/images/content_25.jpg
??? +可以簡單認為: URL == 協(xié)議頭://主機域名/路徑
?
- 常見的URL協(xié)議頭(URL類型)
??? +http\https :超文本傳輸協(xié)議資源, 網(wǎng)絡資源
??? +ftp :文件傳輸協(xié)議
??? +file :本地電腦的文件
?
- URL的創(chuàng)建
??? +傳入完整的字符串創(chuàng)建
```
NSURL *url = [NSURLURLWithString:@"file:///Users/LNJ/Desktop/str.txt"];
```
??? +通過文件路徑創(chuàng)建(默認就是file協(xié)議的)
```
NSURL *url = [NSURLfileURLWithPath:@"/Users/LNJ/Desktop/str.txt"];
```
##3.使用NSURL讀寫字符串
- 從URL中讀取
```
// 用來保存錯誤信息
NSError *error = nil;
?
// 創(chuàng)建URL路徑
//???NSString *path =@"file://192.168.199.119/Users/LNJ/Desktop/lnj.txt";
?
//? 本機可以省略主機域名
//???NSString *path = @"file:///Users/LNJ/Desktop/lnj.txt";
???NSURL *url = [NSURL URLWithString:path];
?
//? 利用fileURLWithPath方法創(chuàng)建出來的URL默認協(xié)議頭為file://
NSURL *url = [NSURLfileURLWithPath:@"/Users/LNJ/Desktop/lnj.txt"];
?
// 讀取文件內(nèi)容
NSString *str = [NSStringstringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
?
// 如果有錯誤信息
if (error) {
???NSLog(@"讀取失敗, 錯誤原因是:%@", [error localizedDescription]);
} else { // 如果沒有錯誤信息
???NSLog(@"讀取成功, 文件內(nèi)容是:\n%@", str);
}
```
- 寫入URL中
```
NSString *str = @"江哥";
[str writeToURL:[NSURLURLWithString:@"/Users/LNJ/Desktop/lnj.txt"] atomically:YES encoding:NSUTF8StringEncodingerror:nil];
```
# 字符串比較
##1.NSString大小寫處理
- 全部字符轉(zhuǎn)為大寫字母
??? +\- (NSString *)uppercaseString;
- 全部字符轉(zhuǎn)為小寫字母
??? +\- (NSString *)lowercaseString
- 首字母變大寫,其他字母都變小寫
??? +\- (NSString *)capitalizedString
---
##2.NSString比較
- \- (BOOL)isEqualToString:(NSString*)aString;
??? +兩個字符串的內(nèi)容相同就返回YES, 否則返回NO
```
???NSString *str1 = @"lnj";
???NSString *str2 = [NSString stringWithFormat:@"lnj"];
???if ([str1 isEqualToString:str2]) {
???????NSLog(@"字符串內(nèi)容一樣");
??? }
?
???if (str1 == str2) {
???????NSLog(@"字符串地址一樣");
??? }
```
- \- (NSComparisonResult)compare:(NSString*)string;
??? +這個方法可以用來比較兩個字符串內(nèi)容的大小
??? +比較方法: 逐個字符地進行比較ASCII值,返回NSComparisonResult作為比較結(jié)果
??? +NSComparisonResult是一個枚舉,有3個值:
???????* 如果左側(cè)?? > 右側(cè),返回NSOrderedDescending,
???????* 如果左側(cè)?? < 右側(cè),返回NSOrderedAscending,
???????* 如果左側(cè)? == 右側(cè)返回NSOrderedSame
```
???NSString *str1 = @"abc";
???NSString *str2 = @"abd";
???switch ([str1 compare:str2]) {
???????case NSOrderedAscending:
???????????NSLog(@"后面一個字符串大于前面一個");
???????????break;
???????case NSOrderedDescending:
???????????NSLog(@"后面一個字符串小于前面一個");
???????????break;
???????case NSOrderedSame:
???????????NSLog(@"兩個字符串一樣");
???????????break;
??? }
??? 輸出結(jié)果: 后面一個字符串大于前面一個
```
- \- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string;
??? +忽略大小寫進行比較,返回值與compare:一致
```
???NSString *str1 = @"abc";
???NSString *str2 = @"ABC";
???switch ([str1 caseInsensitiveCompare:str2]) {
???????case NSOrderedAscending:
???????????NSLog(@"后面一個字符串大于前面一個");
???????????break;
???????case NSOrderedDescending:
???????????NSLog(@"后面一個字符串小于前面一個");
???????????break;
???????case NSOrderedSame:
???????????NSLog(@"兩個字符串一樣");
???????????break;
??? }
??? 輸出結(jié)果:兩個字符串一樣
```
# 字符串搜索
##1.字符串搜索
- \- (BOOL)hasPrefix:(NSString *)aString;
??? +是否以aString開頭
- \- (BOOL)hasSuffix:(NSString *)aString;
??? +是否以aString結(jié)尾
- \- (NSRange)rangeOfString:(NSString*)aString;
??? +用來檢查字符串內(nèi)容中是否包含了aString
??? +如果包含, 就返回aString的范圍
??? +如果不包含, NSRange的location為NSNotFound, length為0
---
##2.NSRange基本概念
- NSRange是Foundation框架中比較常用的結(jié)構(gòu)體, 它的定義如下:
```
typedef struct _NSRange {
???NSUInteger location;
???NSUInteger length;
} NSRange;
// NSUInteger的定義
typedef unsigned int NSUInteger;
```
- NSRange用來表示事物的一個范圍,通常是字符串里的字符范圍或者數(shù)組里的元素范圍
?
- NSRange有2個成員
??? +NSUInteger location : 表示該范圍的起始位置
??? +NSUInteger length : 表示該范圍內(nèi)的長度
?
- 比如@“I love LNJ”中的@“LNJ”可以用location為7,length為3的范圍來表示
---
##3.NSRange的創(chuàng)建
- 有3種方式創(chuàng)建一個NSRange變量
- 方式1
```
NSRange range;
range.location = 7;
range.length = 3;
```
- 方式2
```
NSRange range = {7, 3};
或者
NSRange range = {.location = 7,.length =3};
```
- 方式3 : 使用NSMakeRange函數(shù)
```
NSRange range = NSMakeRange(7, 3);
```
# 字符串截取
##1.字符串的截取
- \- (NSString*)substringFromIndex:(NSUInteger)from;
??? +從指定位置from開始(包括指定位置的字符)到尾部
```
???NSString *str = @"<head>小碼哥</head>";
???str = [str substringFromIndex:7];
???NSLog(@"str = %@", str);
?
輸出結(jié)果: 小碼哥</head>
```
- \- (NSString*)substringToIndex:(NSUInteger)to;
??? +從字符串的開頭一直截取到指定的位置to,但不包括該位置的字符
```
???NSString *str = @"<head>小碼哥</head>";
???str = [str substringToIndex:10];
???NSLog(@"str = %@", str);
輸出結(jié)果: <head>小碼哥
```
- \- (NSString*)substringWithRange:(NSRange)range;
??? +按照所給出的NSRange從字符串中截取子串
```
???NSString *str = @"<head>小碼哥</head>";
???NSRange range;
???/*
???range.location = 6;
???range.length = 3;
???*/
???range.location = [str rangeOfString:@">"].location + 1;
???range.length = [str rangeOfString:@"</"].location -range.location;
???NSString *res = [str substringWithRange:range];
???NSLog(@"res = %@", res);
輸出結(jié)果: 小碼哥
```
# 字符串替換
##1.字符串的替換函數(shù)
- \- (NSString*)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString*)replacement;
??? +用replacement替換target
```
???NSString *str = @"http:**520it.com*img*ljn.gif";
???NSString *newStr = [strstringByReplacingOccurrencesOfString:@"*" withString:@"/"];
???NSLog(@"newStr = %@", newStr);
輸出結(jié)果: http://www.520it.com/img/ljn.gif
```
- \- (NSString*)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
??? +去除首尾
```
???NSString *str =? @"?? http://520it.com/img/ljn.gif?? ";
???NSString *newStr = [str stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceCharacterSet]];
???NSLog(@"str =|%@|", str);
???NSLog(@"newStr =|%@|", newStr);
?
輸出結(jié)果:
str =|??http://520it.com/img/ljn.gif?? |
newStr =|http://520it.com/img/ljn.gif|
```
???NSString *str =?@"***http://520it.com/img/ljn.gif***";
???NSString *newStr = [str stringByTrimmingCharactersInSet:[NSCharacterSetcharacterSetWithCharactersInString:@"*"]];
?
???NSLog(@"str =|%@|", str);
???NSLog(@"newStr =|%@|", newStr);
?
輸出結(jié)果:
str =|***http://520it.com/img/ljn.gif***|
newStr =|http://520it.com/img/ljn.gif|
```
# 字符串與路徑
##1.NSString與路徑
- \- (BOOL)isAbsolutePath;
??? +是否為絕對路徑
```
????// 其實就是判斷是否以/開頭
//???NSString *str = @"/Users/NJ-Lee/Desktop/lnj.txt";
???NSString *str = @"Users/NJ-Lee/Desktop/lnj.txt";
???if ([str isAbsolutePath]) {
???????NSLog(@"是絕對路徑");
???}else
??? {
???????NSLog(@"不是絕對路徑");
??? }
```
- \- (NSString *)lastPathComponent;
??? +獲得最后一個目錄
```
???// 截取最后一個/后面的內(nèi)容
???NSString *str = @"/Users/NJ-Lee/Desktop/lnj.txt";
???NSString *component = [str lastPathComponent];
???NSLog(@"component = %@", component);
```
- \- (NSString*)stringByDeletingLastPathComponent;
??? +刪除最后一個目錄
```
???// 其實就是上次最后一個/和之后的內(nèi)容
???NSString *str = @"/Users/NJ-Lee/Desktop/lnj.txt";
???NSString *newStr = [str stringByDeletingLastPathComponent];
???NSLog(@"newStr = %@", newStr);
```
- \- (NSString*)stringByAppendingPathComponent:(NSString *)str;
??? +在路徑的后面拼接一個目錄
(也可以使用stringByAppendingString:或者stringByAppendingFormat:拼接字符串內(nèi)容)
```
// 其實就是在最后面加上/和要拼接得內(nèi)容
???// 注意會判斷后面有沒有/有就不添加了, 沒有就添加, 并且如果有多個會替換為1個
//???NSString *str = @"/Users/NJ-Lee/Desktop";
???NSString *str = @"/Users/NJ-Lee/Desktop/";
???NSString *newStr = [strstringByAppendingPathComponent:@"lnj"];
???NSLog(@"newStr = %@", newStr);
```
##2.NSString與文件拓展名
- \- (NSString *)pathExtension;
??? +獲得拓展名
```
???// 其實就是從最后面開始截取.之后的內(nèi)容
//???NSString *str = @"lnj.txt";
???NSString *str = @"abc.lnj.txt";
???NSString *extension = [str pathExtension];
???NSLog(@"extension = %@", extension);
```
- \- (NSString*)stringByDeletingPathExtension;
??? +刪除尾部的拓展名
```
???// 其實就是上次從最后面開始.之后的內(nèi)容
//???NSString *str = @"lnj.txt";
???NSString *str = @"abc.lnj.txt";
???NSString *newStr = [str stringByDeletingPathExtension];
???NSLog(@"newStr = %@", newStr);
```
- \- (NSString*)stringByAppendingPathExtension:(NSString *)str;
??? +在尾部添加一個拓展名
```
// 其實就是在最后面拼接上.和指定的內(nèi)容
???NSString *str = @"lnj";
???NSString *newStr = [strstringByAppendingPathExtension:@"gif"];
???NSLog(@"newStr = %@", newStr);
```
# 字符串與基本數(shù)據(jù)類型轉(zhuǎn)換
##1.
- \- (NSUInteger)length;
??? +返回字符串的長度(有多少個文字)
?
- \-(unichar)characterAtIndex:(NSUInteger)index;
??? +返回index位置對應的字符
---
##2.字符串和其他數(shù)據(jù)類型轉(zhuǎn)換
- 轉(zhuǎn)為基本數(shù)據(jù)類型
??? +\- (double)doubleValue;
??? +\- (float)floatValue;
??? +\- (int)intValue;
```
???NSString *str1 = @"110";
???NSString *str2 = @"10";
???int res = str1.intValue + str2.intValue;
???NSLog(@"res = %i", res);
```
???NSString *str1 = @"110";
???NSString *str2 = @"10.1";
???double res = str1.doubleValue + str2.doubleValue;
???NSLog(@"res = %f", res);
```
- 轉(zhuǎn)為C語言中的字符串
??? +\- (char *)UTF8String;
```
???NSString *str = @"abc";
???const char *cStr = [str UTF8String];
??? NSLog(@"cStr= %s", cStr);
```
???char *cStr = "abc";
???NSString *str = [NSString stringWithUTF8String:cStr];
???NSLog(@"str = %@", str);
```
# NSMutableString練習
##1.NSMutableString練習
- 從要求講3個520it拼接在一起
?
- 會生成很多新的字符串
```
???NSString *res = @"";
???NSString *subStr = @"520";
???// 1.拼接字符串
//???res = [res stringByAppendingString:subStr];
//???res = [res stringByAppendingString:@" "];
//
//???res = [res stringByAppendingString:subStr];
//???res = [res stringByAppendingString:@" "];
//
//???res = [res stringByAppendingString:subStr];
//???res = [res stringByAppendingString:@" "];
?
???for (int i = 0; i < 3; ++i) {
???????res = [res stringByAppendingString:subStr];
???????res = [res stringByAppendingString:@" "];
??? }
???// 2.刪除末尾的空格
//???res = [res stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceCharacterSet]];
???res = [res substringToIndex:res.length - 1];
???NSLog(@"res = |%@|", res);
```
- 不會生成新的字符串
```
???NSString *subStr = @"520it";
???NSMutableString *res = [NSMutableString string];
???// 1.拼接字符串
???for (int i = 0; i < 3; ++i) {
???????[res appendString:subStr];
???????[res appendString:@" "];
??? }
???// 2.刪除空格
//???[res replaceCharactersInRange:NSMakeRange(res.length - 1, 1)withString:@""];
???[res deleteCharactersInRange:NSMakeRange(res.length - 1, 1)];
???NSLog(@"res = |%@|", res);
```
# NSMutableString常用方法
##1.NSMutableString常用方法
- \- (void)appendString:(NSString*)aString;
??? +拼接aString到最后面
```
- \- (void)appendFormat:(NSString *)format,...;
??? +拼接一段格式化字符串到最后面
```
???NSMutableString *strM = [NSMutableString string];
???NSLog(@"strM = %@", strM);
???[strM appendString:@"lnj"];
???NSLog(@"strM = %@", strM);
```
- \-(void)deleteCharactersInRange:(NSRange)range;
??? +刪除range范圍內(nèi)的字符串
```
???NSMutableString *strM = [NSMutableStringstringWithString:@"http://www.520it.com"];
????// 一般情況下利用rangeOfString和deleteCharactersInRange配合刪除指定內(nèi)容
????NSRange range = [strM rangeOfString:@"http://"];
????[strM deleteCharactersInRange:range];
????NSLog(@"strM = %@", strM);
```
- \- (void)insertString:(NSString *)aStringatIndex:(NSUInteger)loc;
??? +在loc這個位置中插入aString
```
???NSMutableString *strM = [NSMutableStringstringWithString:@"www.520it.com"];
???[strM insertString:@"http://" atIndex:0];
??? NSLog(@"strM= %@", strM);
```
- \-(void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString;
??? +使用aString替換range范圍內(nèi)的字符串
```
???NSMutableString *strM = [NSMutableStringstringWithString:@"http://www.520it.com/lnj.png"];
???NSRange range = [strM rangeOfString:@"lnj"];
???[strM replaceOccurrencesOfString:@"lnj"withString:@"jjj" options:0 range:range];
???NSLog(@"strM = %@", strM);
```
##2.字符串使用注意事項
- @”lnj”這種方式創(chuàng)建的字符串始終是NSString,不是NSMutalbeString.所以下面的代碼創(chuàng)建的還是NSString,此時使用可變字符串的函數(shù),無法操作字符串。
```
NSMutalbeString *s1 = @”lnj”;
// 會報錯
[strM insertString:@"my name is "atIndex:0];
```
# NSArray 遍歷
##1.NSArray的下標遍歷
```
???NSArray *arr = @[p1, p2, p3, p4, p5];
???for (int i = 0; i < arr.count; ++i) {
???????Person *p = arr[i];
???????[p say];
??? }
```
##2.NSArray的快速遍歷
```
???NSArray *arr = @[p1, p2, p3, p4, p5];
??for (Person *p in arr) {
???????[p say];
??? }
```
##3.NSArray 使用block進行遍歷
```
???[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
???????NSLog(@"obj = %@, idx = %lu", obj, idx);
???????Person *p = obj;
???????[p say];
???}];
```
##4.NSArray給所有元素發(fā)消息
- 讓集合里面的所有元素都執(zhí)行aSelector這個方法
??? +\- (void)makeObjectsPerformSelector:(SEL)aSelector;
??? +\- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;
```
???// 讓數(shù)組中所有對象執(zhí)行這個方法
???// 注意: 如果數(shù)組中的對象沒有這個方法會報錯
//???[arr makeObjectsPerformSelector:@selector(say)];
???[arr makeObjectsPerformSelector:@selector(eat:)withObject:@"bread"];
```
# NSArray排序
##1.NSArray排序
- Foundation自帶類排序
```
NSArray *arr = @[@(1), @(9), @(5), @(2)];
NSArray *newArr = [arrsortedArrayUsingSelector:@selector(compare:)];
```
- 自定義類排序
```
???NSArray *arr = @[p1, p2, p3, p4, p5];
???//??? 默認按照升序排序
???NSArray *newArr = [arr sortedArrayWithOptions:NSSortConcurrentusingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
???????return obj1.age > obj2.age;
???}];
???NSLog(@"%@", newArr);
---
# NSArray文件讀寫
##1.NSArray數(shù)據(jù)寫入到文件中
```
???NSArray *arr = @[@"lnj", @"lmj", @"jjj",@"xcq"];
???BOOL flag = [arrwriteToFile:@"/Users/LNJ/Desktop/persons.plist" atomically:YES];
???NSLog(@"%i", flag);
```
##2.從文件中讀取數(shù)據(jù)到NSArray中
```
???NSArray *newArr = [NSArrayarrayWithContentsOfFile:@"/Users/LNJ/Desktop/persons.xml"];
???NSLog(@"%@", newArr);
```
# NSArray 與字符串
##1.把數(shù)組元素鏈接成字符串
- \- (NSString*)componentsJoinedByString:(NSString *)separator;
??? +這是NSArray的方法, 用separator作拼接符將數(shù)組元素拼接成一個字符串
```
???NSArray *arr = @[@"lnj", @"lmj", @"jjj",@"xcq"];
???NSString *res = [arr componentsJoinedByString:@"*"];
???NSLog(@"res = %@", res);
輸出結(jié)果:
lnj*lmj*jjj*xcq
```
##2.字符串分割方法
- \- (NSArray*)componentsSeparatedByString:(NSString *)separator;
??? +這是NSString的方法,將字符串用separator作為分隔符切割成數(shù)組元素
```
???NSString *str = @"lnj-lmj-jjj-xcq";
???NSArray *arr = [str componentsSeparatedByString:@"-"];
???NSLog(@"%@", arr);
輸出結(jié)果:
(
???lnj,
???lmj,
???jjj,
???xcq
)
?
# Foundation框架介紹
##1.Foundation框架介紹
- 什么是框架?
??? +眾多功能\API的集合
??? +框架是由許多類、方法、函數(shù)、文檔按照一定的邏輯組織起來的集合,以便使研發(fā)程序變得更容易在OS X下的Mac操作系統(tǒng)中大約有80個框架為所有程序開發(fā)奠定基礎的框架稱為Foundation 框架
?
- Foundation框架的作用
??? +Foundation框架是Mac\iOS中其他框架的基礎
??? +Foundation框架包含了很多開發(fā)中常用的數(shù)據(jù)類型:
???????* 結(jié)構(gòu)體
???????* 枚舉
???????* 類
?
- 如何使用Foundation框架
??? +Foundation框架中大約有125個可用的頭文件,作為一個簡單的形式,可以簡單地使用以下語句導入#import<Foundation/Foundation.h>因為Foundation.h文件實際上導入其他所有Foundation框架中的頭文件
?
- Foundation框架中的類
??? +Foundation框架允許使用一些基本對象,如數(shù)字和字符串,以及一些對象集合,如數(shù)組,字典和集合,其他功能包括處理日期和時間、內(nèi)存管理、處理文件系統(tǒng)、存儲(或歸檔)對象、處理幾何數(shù)據(jù)結(jié)構(gòu)(如點和長方形)
??? +Foundation框架提供了非常多好用的類, 比如
```
NSString : 字符串
NSArray : 數(shù)組
NSDictionary : 字典
NSDate : 日期
NSData : 數(shù)據(jù)
NSNumber : 數(shù)字
```
- Foundation框架中的類都是以NS為前綴(Next Step的縮寫)
??? +喬布斯于1976年創(chuàng)立蘋果公司
??? +喬布斯于1985年離開蘋果公司, 創(chuàng)立NeXT公司, 開發(fā)了Next Step操作系統(tǒng)
??? +在開發(fā)Next Step操作系統(tǒng)過程中產(chǎn)生了Foundation框架
??? +1997年, 蘋果公司收購NeXT公司,?? 喬布斯重返蘋果公司(Mac系統(tǒng)就是基于NextStep系統(tǒng))
??? +2007年, 蘋果公司發(fā)布了iOS系統(tǒng)(iOS系統(tǒng)基于Mac系統(tǒng))
---
##2.Foundation框架常見錯誤
- 有時候會在不經(jīng)意之間修改了系統(tǒng)自帶的頭文件,比如NSString.h, 這時會出現(xiàn)以下錯誤:

- 解決方案很簡單, 只需要刪除Xcode的緩存即可
??? +緩存路徑是/Users/用戶名/Library/Developer/Xcode/DerivedData(默認情況下, 這是一個隱藏文件夾)
?
- 要想看到上述文件夾, 必須在終端敲指令顯示隱藏文件夾, 指令如下
??? +顯示隱藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool true
??? +隱藏隱藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool false
??? +(輸入指令后, 一定要重新啟動Finder)
?
# NSArray基本概念
##1.NSArray的基本概念
- 什么是NSArray?
??? +NSArray是OC中的數(shù)組類,開發(fā)中建議盡量使用NSArray替代C語言中的數(shù)組
??? +C語言中數(shù)組的弊端
???????* int array[4] = {10, 89, 27, 76};
???????* 只能存放一種類型的數(shù)據(jù).(類型必須一致)
???????* 不能很方便地動態(tài)添加數(shù)組元素、不能很方便地動態(tài)刪除數(shù)組元素(長度固定)
?
- NSArray的使用注意
??? +只能存放任意OC對象, 并且是有順序的
??? +不能存儲非OC對象, 比如int\float\double\char\enum\struct等
??? +它是不可變的,一旦初始化完畢后,它里面的內(nèi)容就永遠是固定的, 不能刪除里面的元素, 也不能再往里面添加元素
---
##2.NSArray的創(chuàng)建方式
- \+ (instancetype)array;
- \+(instancetype)arrayWithObject:(id)anObject;
- \+ (instancetype)arrayWithObjects:(id)firstObj,...;
- \+ (instancetype)arrayWithArray:(NSArray*)array;
?
- \+ (id)arrayWithContentsOfFile:(NSString*)path;
- \+ (id)arrayWithContentsOfURL:(NSURL*)url;
---
##3.NSArray 的使用注意事項
- NSArray直接使用NSLog()作為字符串輸出時是小括號括起來的形式。
- NSArray中不能存儲nil,因為NSArray認為nil是數(shù)組的結(jié)束(nil是數(shù)組元素結(jié)束的標記)。nil就是0。0也是基本數(shù)據(jù)類型,不能存放到NSArray中。
```
???NSArray *arr = [NSArray arrayWithObjects:@"lnj", nil,@"lmj",@"jjj", nil];
???NSLog(@"%@", arr);
輸出結(jié)果:
(
???lnj
)
```
##4.NSArray的常用方法
- \- (NSUInteger)count;
??? +獲取集合元素個數(shù)
?
- \- (id)objectAtIndex:(NSUInteger)index;
??? +獲得index位置的元素
?
- \- (BOOL)containsObject:(id)anObject;
??? +是否包含某一個元素
?
- \- (id)lastObject;
??? +返回最后一個元素
?
- \- (id)firstObject;
??? +返回最后一個元素
?
- \-(NSUInteger)indexOfObject:(id)anObject;
??? +查找anObject元素在數(shù)組中的位置(如果找不到,返回-1)
?
- \- (NSUInteger)indexOfObject:(id)anObjectinRange:(NSRange)range;
??? +在range范圍內(nèi)查找anObject元素在數(shù)組中的位置
---
##5.NSArray的簡寫形式
- 自從2012年開始, Xcode的編譯器多了很多自動生成代碼的功能, 使得OC代碼更加精簡
?
- 數(shù)組的創(chuàng)建
??? +之前
```
[NSArray arrayWithObjects:@"Jack",@"Rose", @"Jim", nil];
```
??? +現(xiàn)在
```
@[@"Jack", @"Rose",@"Jim"];
```
- 數(shù)組元素的訪問
??? +之前
```
[array objectAtIndex:0];
```
??? +現(xiàn)在
```
array[0];
```
# NSMutableArray基本概念
##1.NSMutableArray介紹
- 什么是NSMutableArray
??? +NSMutableArray是NSArray的子類
??? +NSArray是不可變的,一旦初始化完畢后,它里面的內(nèi)容就永遠是固定的, 不能刪除里面的元素, 也不能再往里面添加元素
??? +NSMutableArray是可變的,隨時可以往里面添加\更改\刪除元素
---
##2.NSMutableArray基本用法
- 創(chuàng)建空數(shù)組
```
NSMutableArray *arr = [NSMutableArrayarray];
```
- 創(chuàng)建數(shù)組,并且指定長度為5,此時也是空數(shù)組
```
NSMutableArray *arr2 = [[NSMutableArrayalloc] initWithCapacity:5];
```
- 創(chuàng)建一個數(shù)組,包含兩個元素
```
NSMutableArray *arr3 = [NSMutableArrayarrayWithObjects:@"1",@"2", nil];
```
- 調(diào)用對象方法創(chuàng)建數(shù)組
```
NSMutableArray *arr4 = [[NSMutableArrayalloc] initWithObjects:@"1",@"2", nil];
```
- \- (void)addObject:(id)object;
??? +添加一個元素
- \- (void)addObjectsFromArray:(NSArray*)array;
??? +添加otherArray的全部元素到當前數(shù)組中
- \- (void)insertObject:(id)anObjectatIndex:(NSUInteger)index;
??? +在index位置插入一個元素
- \- (void)removeLastObject;
??? +刪除最后一個元素
?
- \- (void)removeAllObjects;
??? +刪除所有的元素
?
- \-(void)removeObjectAtIndex:(NSUInteger)index;
??? +刪除index位置的元素
?
- \- (void)removeObject:(id)object;
??? +刪除特定的元素
?
- \-(void)removeObjectsInRange:(NSRange)range;
??? +刪除range范圍內(nèi)的所有元素
?
- \- (void)replaceObjectAtIndex:(NSUInteger)indexwithObject:(id)anObject;
??? +用anObject替換index位置對應的元素
?
- \-(void)exchangeObjectAtIndex:(NSUInteger)idx1withObjectAtIndex:(NSUInteger)idx2;
??? +交換idx1和idx2位置的元素
---
##3.NSMutableArray 錯誤用法
- 不可以使用@[]創(chuàng)建可變數(shù)組
```
NSMutableArray *array = @[@"lnj",@"lmj", @"jjj"];
// 報錯, 本質(zhì)還是不可變數(shù)組
[array addObject:@“Peter”];
```
# NSMutableString基本概念
##1.NSMutableString 基本概念
- NSMutableString 類 繼承NSString類,那么NSString
總結(jié)
以上是生活随笔為你收集整理的OC语言之Protocol基本使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ GUI轻量工具包FLTK介绍 (
- 下一篇: 区间直觉模糊集相似度及matlab应用