Day17.protocol協(xié)議和NSString字符串的用法
1符相,protocol基本概念
#import <Foundation/Foundation.h>
@protocol SportProtocol <NSObject>
// 方法聲明列表
- (void)playFootball;
- (void)playBasketball;
- (void)playBaseball;
@end
2,protocol注意點(diǎn)
- SportProtocol.h
#import <Foundation/Foundation.h>
@protocol SportProtocol <NSObject>
// 1.協(xié)議只能聲明方法, 不能聲明屬性
//{
// int _age;
//}
// 方法聲明列表
// 注意: 如果沒有使用任何關(guān)鍵字修飾協(xié)議中的方法, 那么該方法默認(rèn)就是required的
@required
// 如果協(xié)議中的方法是@required的, 而遵守協(xié)議的類又沒有實(shí)現(xiàn)該方法, 那么會報(bào)一個(gè)警告
- (void)playFootball;
@optional // 可選
// 如果協(xié)議中的方法是@optional的, 而遵守協(xié)議的類又沒有實(shí)現(xiàn)該方法, 那么不會報(bào)警告
- (void)playBasketball;
- (void)playBaseball;
// 注意:@required和@optional僅僅使用程序員之間交流, 并不能嚴(yán)格的控制某一個(gè)遵守該協(xié)議的類必須要實(shí)現(xiàn)該方法, 因?yàn)榧幢悴皇菍?shí)現(xiàn)也不會報(bào)錯(cuò), 只會報(bào)一個(gè)警告
@end
- CrazySportProtocol.h
#import <Foundation/Foundation.h>
#import "SportProtocol.h"
// 4.OC中的協(xié)議又可以遵守其它協(xié)議, 只要一個(gè)協(xié)議遵守了其它協(xié)議, 那么這個(gè)協(xié)議中就會自動包含其它協(xié)議的聲明
@protocol CrazySportProtocol <SportProtocol>
// 跳樓
- (void)jumping;
@end
- StudyProtocol.h
#import <Foundation/Foundation.h>
@protocol StudyProtocol <NSObject>
- (void)study;
@end
- Person.h
#import <Foundation/Foundation.h>
#import "SportProtocol.h"
#import "StudyProtocol.h"
// 3.在OC中一個(gè)類可以遵守1個(gè)或多個(gè)協(xié)議
// 注意: OC中的類只能有一個(gè)父類, 也就是說OC只有單繼承
@interface Person : NSObject<SportProtocol, StudyProtocol>
@end
- Sutdent.h
#import "Person.h"
// 2.父類遵守了某個(gè)協(xié)議, 那么子類也會自動遵守這個(gè)協(xié)議
@interface Sutdent : Person
@end
3褒链,協(xié)議的應(yīng)用場景1-類型限定
- 首先定義一個(gè)協(xié)議WifeCondition.h
#import <Foundation/Foundation.h>
@protocol WifeCondition <NSObject>
// 會做飯
- (void)cooking;
// 會洗衣服
- (void)washing;
// 有一份好工作
- (void)job;
@end
- 定義一個(gè)Wife.h類
#import <Foundation/Foundation.h>
#import "WifeCondition.h"
@interface Wife : NSObject <WifeCondition>
@end
#import "Wife.h"
@implementation Wife
// 會做飯
- (void)cooking
{
NSLog(@"%s", __func__);
}
// 會洗衣服
- (void)washing
{
NSLog(@"%s", __func__);
}
// 有一份好工作
- (void)job
{
NSLog(@"%s", __func__);
}
@end
- main.m類
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Wife.h"
#import "WifeCondition.h"
int main(int argc, const char * argv[]) {
Person *p = [Person new];
// 1.協(xié)議的第一個(gè)應(yīng)用場景, 可以將協(xié)議寫在數(shù)據(jù)類型的右邊, 明確的標(biāo)注如果想給該變量賦值, 那么該對象必須遵守某個(gè)協(xié)議
// Wife<WifeCondition> *w = [Wife new];
Wife *w = [Wife new];
p.wife = w;
[p show];
return 0;
}
- 定義Person.h類
#import <Foundation/Foundation.h>
#import "Wife.h"
@interface Person : NSObject
// 媳婦
// 注意: 記住一點(diǎn), 類型限定是寫在數(shù)據(jù)類型的右邊的
@property (nonatomic, strong) Wife<WifeCondition> *wife;
- (void)show;
@end
#import "Person.h"
@implementation Person
- (void)show
{
// 注意: 雖然在接受某一個(gè)對象的時(shí)候, 對這個(gè)對象進(jìn)行了類型限定(限定它必須實(shí)現(xiàn)某個(gè)協(xié)議), 但是并不意味著這個(gè)對象就真正的實(shí)現(xiàn)了該方法. 所以每次在調(diào)用對象的協(xié)議方法時(shí)應(yīng)該進(jìn)行一次驗(yàn)證
if ([self.wife respondsToSelector:@selector(cooking)]) {
[self.wife cooking];
}
if ([self.wife respondsToSelector:@selector(washing)]) {
[self.wife washing];
}
if ([self.wife respondsToSelector:@selector(job)]) {
[self.wife job];
}
}
@end
4唁情,協(xié)議的應(yīng)用場景2-代理設(shè)計(jì)模式
- 首先定義一個(gè)BabyProtocol協(xié)議
#import <Foundation/Foundation.h>
@class Baby;
@protocol BabyProtocol <NSObject>
// 喂嬰兒吃東西
- (void)feedFood:(Baby *)baby;
// 哄嬰兒睡覺
- (void)hongBaby:(Baby *)baby;
@end
- 重點(diǎn)Baby.h類
#import <Foundation/Foundation.h>
#import "BabyProtocol.h"
@class Nanny, Studnet;
/*
什么是代理設(shè)計(jì)模式
心相印和超市
超市就是心相印的代理, 它可以幫助心相印賣紙巾
也就是說, 代理也幫助另外一個(gè)類做一些事情
代理設(shè)計(jì)模式的應(yīng)用場景
1.當(dāng)A對象想監(jiān)聽B對象的一些變化時(shí), 可以使用代理設(shè)計(jì)模式
保姆想監(jiān)聽嬰兒的變化, 那么保姆就可以成為嬰兒的代理, 當(dāng)嬰兒發(fā)生變化之后保姆就可以監(jiān)聽到
2.當(dāng)B對象發(fā)生一些事情, 想通知A對象的時(shí)候, 可以使用代理設(shè)計(jì)模式
嬰兒想通知保姆, 那么就可以 讓保姆成為嬰兒的代理, 只要保姆成為嬰兒的代理, 以后嬰兒發(fā)生變化就可以通知保姆
3.當(dāng)對象A無法處理某些行為的時(shí)候,想讓對象B幫忙處理(讓對象B成為對象A的代理對象)
嬰兒無法自己吃東西, 也無法自己入睡, 所以可以讓保姆幫忙處理. 只要讓保姆成為嬰兒的代理就可以幫嬰兒喂它吃東西和哄他睡覺
*/
@interface Baby : NSObject
// 饑餓程度
@property (nonatomic, assign) int hungry;
// 睡意
@property (nonatomic, assign) int sleep;
// 吃東西
- (void)food;
// 困了
- (void)sleepy;
// 讓嬰兒擁有一個(gè)保姆
//@property (nonatomic, strong) Nanny *nanny;
//@property (nonatomic, strong) Studnet *stu;
// 如果使用id類型來接收保姆, 如果將來換保姆了, 嬰兒類不用修改代碼
@property (nonatomic, strong) id<BabyProtocol> nanny;
@end
#import "Baby.h"
#import "Nanny.h"
@implementation Baby
- (void)food
{
self.hungry += 5;
NSLog(@"要吃東西 %i", self.hungry);
// 通知保姆
if ([self.nanny respondsToSelector:@selector(feedFood:)]) {
[self.nanny feedFood:self];
}
}
- (void)sleepy
{
self.sleep += 5;
NSLog(@"困了 %i", self.sleep);
// 通知保姆
if ([self.nanny respondsToSelector:@selector(hongBaby:)]) {
[self.nanny hongBaby:self];
}
}
@end
- 代理類 和Nanny.h都一樣的實(shí)現(xiàn)方式
#import <Foundation/Foundation.h>
#import "BabyProtocol.h"
@class Baby;
@interface Nanny : NSObject <BabyProtocol>
/*
// 喂嬰兒吃東西
- (void)feedFood:(Baby *)baby;
// 哄嬰兒睡覺
- (void)hongBaby:(Baby *)baby;
*/
@end
#import "Nanny.h"
#import "Baby.h"
@implementation Nanny
- (void)feedFood:(Baby *)baby
{
baby.hungry -= 10;
NSLog(@"喂嬰兒吃東西 %i", baby.hungry);
}
- (void)hongBaby:(Baby *)baby
{
baby.sleep += 10;
NSLog(@"哄嬰兒睡覺 %i", baby.sleep);
}
@end
- main.m類
int main(int argc, const char * argv[]) {
// 1.創(chuàng)建嬰兒
Baby *b = [Baby new];
// 2.創(chuàng)建保姆
// Nanny *n = [Nanny new];
// 3.將保姆賦值給嬰兒呢
// b.nanny = n;
// 4.換保姆
// Studnet *stu = [Studnet new];
// b.nanny = stu;
// 5.再次換保姆
// Teacher *tea = [Teacher new];
// b.nanny = tea;
Dog *d = [Dog new];
b.nanny = d;
//4.嬰兒發(fā)飆
[b food];
[b sleepy];
return 0;
}
5,代理設(shè)計(jì)模式練習(xí)
- main類
#import <Foundation/Foundation.h>
#import "Person.h"
#import "LinkHome.h"
#import "LoveHome.h"
int main(int argc, const char * argv[]) {
/*
用代理實(shí)現(xiàn)學(xué)生找房子, 不具備找房子的能力
所以學(xué)生可以找另一個(gè)對象來幫它找房子, 那么另一個(gè)對象就是學(xué)生的代理
*/
Person *p = [Person new];
LinkHome *lh = [LinkHome new];
p.delegate = lh;
// LoveHome *lh = [LoveHome new];
// p.delegete = lh;
[p findHourse];
return 0;
}
- StudentProtocol.h協(xié)議類
#import <Foundation/Foundation.h>
@protocol StudentProtocol <NSObject>
// 幫學(xué)生找房子
- (void)studentFindHourse;
@end
- Person.h類
#import <Foundation/Foundation.h>
//#import "StudentProtocol.h"
/*
協(xié)議的編寫規(guī)范:
1.一般情況下, 當(dāng)前協(xié)議屬于誰, 我們就將協(xié)議定義到誰的頭文件中
2.協(xié)議的名稱一般以它屬于的那個(gè)類的類名開頭, 后面跟上protocol或者delegate
3.協(xié)議中的方法名稱一般以協(xié)議的名稱protocol之前的作為開頭
4.一般情況下協(xié)議中的方法會將觸發(fā)該協(xié)議的對象傳遞出去
5.一般情況下一個(gè)類中的代理屬于的名稱叫做 delegate
6.當(dāng)某一個(gè)類要成為另外一個(gè)類的代理的時(shí)候,
一般情況下在.h中用@protocol 協(xié)議名稱;告訴當(dāng)前類 這是一個(gè)協(xié)議.
在.m中用#import真正的導(dǎo)入一個(gè)協(xié)議的聲明
*/
@class Person;
@protocol PersonProtocol <NSObject>
- (void)personFindHourse:(Person *)person;
@end
@interface Person : NSObject
//@property (nonatomic, strong) id<StudentProtocol> delegete;
@property (nonatomic, strong) id<PersonProtocol> delegate;
- (void)findHourse;
@end
#import "Person.h"
@implementation Person
- (void)findHourse
{
NSLog(@"學(xué)生想找房子");
// 通知代理幫他找房子
if ([self.delegate respondsToSelector:@selector(personFindHourse:)]) {
[self.delegate personFindHourse:self];
}
}
@end
- LinkHome.h類
#import <Foundation/Foundation.h>
//#import "Person.h"
@protocol PersonProtocol;
@interface LinkHome : NSObject <PersonProtocol>
@end
#import "LinkHome.h"
#import "Person.h"
@implementation LinkHome
- (void)personFindHourse:(Person *)person
{
NSLog(@"%s", __func__);
}
@end
NSString和NSMutableString的用法
1甫匹,NSString的基本概念
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
//如何創(chuàng)建字符串對象
/*
通過不同的方式創(chuàng)建字符串,字符串對象儲存的位置也不一樣
>如果是通過字符串常量創(chuàng)建,那么字符串對象存儲在常量區(qū)中
>如果是通過alloc initWithFormat/stringWithFormat創(chuàng)建,那么字符串對象存儲在堆區(qū)中
而且需要注意:
>不同的平臺存儲的方式也不一樣,如果是Mac平臺系統(tǒng)會自動對字符串對象進(jìn)行優(yōu)化,但是如果是iOS平臺就是兩個(gè)對象
>不同的編譯器存儲的方式也不一樣,如果是Xcode6以下并且是在iOS平臺,那么每次alloc都會創(chuàng)建一個(gè)新的對象,如果是在Xcode6以上那么alloc多次指向同一塊存儲空間
*/
//1.通過字符串常量創(chuàng)建
//注意:如果是通過字符串常量創(chuàng)建對象,并且字符串常量的內(nèi)容一致,那么如果創(chuàng)建多個(gè)字符串對象,多個(gè)對象指向同一塊存儲空間
NSString *str1 = @"lnj";
NSString *str11 = @"lnj";
NSLog(@"str1 = %p, str11 = %p", str1 ,str11);
//2.通過alloc init創(chuàng)建
//只要調(diào)用alloc就會在堆內(nèi)存中開辟一塊存儲空間
NSString *str2 = [[NSString alloc]initWithFormat:@"lmj"];
NSString *str22 = [[NSString alloc]initWithFormat:@"lmj"];
NSLog(@"str2 = %p, str22 = %p", str2, str22);
//3.通過類工廠方法創(chuàng)建/ stringWithFormat
//內(nèi)部其實(shí)就是封裝了alloc init
NSString *str3 = [NSString stringWithFormat:@"zs"];
NSString *str33= [NSString stringWithFormat:@"zs"];
/*
注意:一般情況下,只要是通過alloc或者類工廠方法創(chuàng)建的對象,每次都會在堆內(nèi)存中開辟一塊新的存儲空間
但是如果是通過alloc的initWithString方法除外,因?yàn)檫@個(gè)方法是通過copy返回一個(gè)字符串對象給我們
而copy又分為深拷貝和淺拷貝,如果是深拷貝會創(chuàng)建一個(gè)新的對象,如果是淺拷貝不會創(chuàng)建一個(gè)新的對象,而是直接返回被拷貝的對象的地址給我們
*/
NSString *str4 = [[NSString alloc]initWithString:@"ls"];
NSString *str44 = [[NSString alloc]initWithString:@"ls"];
NSLog(@"str4 = %p, str44 = %p", str4, str44);
return 0;
}
2甸鸟,字符串的讀寫
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
/*
file: 文件路徑,
encoding: 編碼英文 iOS-5988-1 中文 GBK GBK2312 , 一般情況填寫UTF-8
error: 如果讀取錯(cuò)誤, 會將錯(cuò)誤信息保存到error中 ,如果讀取正確, 就沒有error = nil
注意: 以后在OC方法中但凡看到XXXofFile的方法, 傳遞的一定是全路徑(絕對路徑)
*/
NSString *path = @"/Users/xiaomage/Desktop/課堂共享/day17/note/lnj.txt";
NSError *error = nil;
// 從文件中讀取字符串
/*
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
if (error == nil) {
NSLog(@"str = %@", str);
}else
{
NSLog(@"error = %@", [error localizedDescription]);
}
*/
/*
// 將字符串寫入到文件中
NSString *str = @"iOS0601基礎(chǔ)班";
// atomically 如果傳入YES, 字符串寫入文件的過程中如果沒有寫完, 那么不會生成文件
// 如果傳入NO, 字符串寫入文件的過程中如果沒有寫完, 會生成文件
NSString *path2 = @"/Users/xiaomage/Desktop/abc.txt";
BOOL flag = [str writeToFile:path2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSLog(@"flag = %i", flag);
*/
return 0;
}
- URL路徑的path
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
//1.文件讀取
/*
//1.創(chuàng)建URL
//協(xié)議頭 + 主機(jī)地址 + 文件路徑
// NSString *path = @"file://192.168.199.199/Users/NJ-Lee/Desktop/lnj.txt";
// NSString *path = @"http://www.baidu.com";
//注意:如果加載的資源是本機(jī)上的資源,那么URL中的主機(jī)地址可以省略
//雖然主機(jī)地址可以省略,但是需要注意,文件路勁中最前面的/不能省略,文件路徑最前面的/代表根路徑
// NSString *path = @"file:///Users/NJ-Lee/Desktop/lnj.txt";
// NSURL *url = [NSURL URLWithString:path];
// NSString *path = @"file:///Users/NJ-Lee/Desktop/lnj.txt";
//注意:如果是通過NSURL的fileURLWithPath:方法創(chuàng)建URL,那么系統(tǒng)會自動給我們傳入的字符串添加協(xié)議頭(file://),所以字符串中不需要再寫file://
// 注意:開發(fā)中一 般情況下,如果是訪問本機(jī)的資源,創(chuàng)建URL的時(shí)候,建議使用fileURLWithPath方法創(chuàng)建
//因?yàn)閡rl不支持中文,如果URL中包含中文,那么無法訪問;但是如果是通過fileURLWithString方法創(chuàng)建URL,哪怕URL中包含中文也可以進(jìn)行訪問,系統(tǒng)內(nèi)部會自動對URL中包含的中文進(jìn)行處理
// NSURL *url = [NSURL fileURLWithPath:path];
NSString *path = @"file:///Users/NJ-Lee/Desktop/未命名文件夾/lnj.txt";
//如果URL中包含中文,又非不通過fileURLWithPath創(chuàng)建,也可以破
//如果想破就必須在創(chuàng)建URL之前先對字符串中的中文進(jìn)行處理,進(jìn)行百分號編碼
NSLog(@"處理前:%@", path);
path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"處理后:%@", path);
NSURL *url = [NSURL URLWithString:path];
NSLog(@"url = %@", url);
//2.根據(jù)URL加載文件中的字符串
NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"str = %@", str);
*/
//2.文件寫入
NSString *str = @"lnj";
// NSString *path = @"file:///Users/NJ-Lee/Desktop/未命名文件夾/abc.txt";
// path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// NSURL *url = [NSURL URLWithString:path];
NSString *path = @"/Users/NJ-Lee/Desktop/未命名文件夾/abc.txt";
NSURL *url = [NSURL fileURLWithPath:path];
[str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
//注意點(diǎn):如果多次往同一個(gè)文件中寫入內(nèi)容,那么后一次的會覆蓋前一次的
NSString *str2 = @"xxoo";
[str2 writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
return 0;
}
3,字符串的比較
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
NSString *str1 = @"abc";
NSString *str2 = @"ABC";
/*
// 比較兩個(gè)字符串的"內(nèi)容"是否相同
BOOL flag = [str1 isEqualToString:str2];
NSLog(@"flag = %i", flag);
// 下面這個(gè)方法, 是比較兩個(gè)字符串的"地址"是否相同
flag = (str1 == str2);
NSLog(@"flag = %i", flag);
*/
// 比較字符串的大小
/*
// NSOrderedAscending 前面的小于后面的
// NSOrderedSame, 兩個(gè)字符串相等
// NSOrderedDescending 前面的大于后面的
switch ([str1 compare:str2]) {
case NSOrderedAscending:
NSLog(@"str1小于str2");
break;
case NSOrderedSame:
NSLog(@"str1等于str2");
break;
case NSOrderedDescending:
NSLog(@"str1大于str2");
break;
default:
break;
}
*/
/*
// 忽略大小寫進(jìn)行比較
switch ([str1 caseInsensitiveCompare:str2]) {
case NSOrderedAscending:
NSLog(@"str1小于str2");
break;
case NSOrderedSame:
NSLog(@"str1等于str2");
break;
case NSOrderedDescending:
NSLog(@"str1大于str2");
break;
default:
break;
}
*/
return 0;
}
4,字符串搜索
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
// NSString *str = @"http://www.520it.com/img/lnj.gif";
// 1.判斷是否以什么開頭
/*
// 本質(zhì)就是從字符串的第一個(gè)字符開始匹配, 只要不匹配就返回NO
if ([str hasPrefix:@"http://"]) {
NSLog(@"是一個(gè)URL");
}else
{
NSLog(@"不是一個(gè)URL");
}
*/
// 2.判斷是否以什么結(jié)尾
/*
// 本質(zhì)就是從字符串的最后一個(gè)字符開始匹配, 只要不匹配就返回NO
if ([str hasSuffix:@".gif"]) {
NSLog(@"動態(tài)圖片");
}else{
NSLog(@"不是動態(tài)圖片");
}
*/
// 3.判斷字符串中是否包含520it.com
/*
NSString *str = @"abcd";
// 只要str中包含該字符串, 那么就會返回該字符串在str中的起始位置以及該字符串的長度
// location從0開始 , length從1開始
// 如果str中沒有需要查找的字符串, 那么返回的range的length=0, location = NSNotFound
NSRange range = [str rangeOfString:@"lnj"];
// if (range.location == NSNotFound) {
if (range.length == 0){
NSLog(@"str中沒有需要查找的字符串");
}else{
NSLog(@"str中有需要查找的字符串");
NSLog(@"location = %lu, length = %lu", range.location, range.length);
}
*/
return 0;
}
5兵迅,字符串截取
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
NSString *str = @"<head>小碼哥</head>";
/*
// NSRange : 位置/長度
// NSRange range = {6, 3};
// NSRange range;
// range.location = 6;
// range.length = 3;
// 只要是OC提供的結(jié)構(gòu)體, 一般都可以使用NSMakeXXX來創(chuàng)建
// NSRange range = NSMakeRange(6, 3);
*/
/*
// 1.動態(tài)獲取截取的起始位置 值:6
NSUInteger location = [str rangeOfString:@">"].location + 1;
// 2.動態(tài)獲取截取的長度 值:3
// 注意:rangeOfString是從左至右的開始查找, 只要找到就不找了
// NSUInteger length = [str rangeOfString:@"<" options:NSBackwardsSearch].location - location;
NSUInteger length = [str rangeOfString:@"</"].location - location;
NSLog(@"location = %lu, length = %lu", location, length);
NSRange range = NSMakeRange(location, length);
NSString *newStr = [str substringWithRange:range];
NSLog(@"str = %@", str);
NSLog(@"newStr = %@", newStr);
// NSString *temp = @"abcdefa";
// NSRange range =[temp rangeOfString:@"a" options:NSBackwardsSearch];
// NSLog(@"%lu", range.location);
*/
// 從什么地方開始截取, 一直截取到最后
// NSString *newStr = [str substringFromIndex:6];
// NSLog(@"newStr = %@", newStr);
// 從開頭開始截取, 一直截取到什么位置
// NSString *newStr = [str substringToIndex:6];
// NSLog(@"newStr = %@", newStr);
/*
<head>小碼哥</head> --> 小碼哥</head> --> 小碼哥
<head>小碼哥</head> --> <head>小碼哥 --> 小碼哥
*/
NSLog(@"str = %@", str);
NSUInteger location = [str rangeOfString:@">"].location + 1;
NSString *newStr = [str substringFromIndex:location];
NSLog(@"newStr = %@", newStr);
location = [newStr rangeOfString:@"</"].location;
// 改變了指針的指向, 并不是修改了原來的字符串
newStr = [newStr substringToIndex:location];
NSLog(@"newStr = %@", newStr);
return 0;
}
6抢韭,字符串替換
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
/*
// 需求: 將&符號替換為/
NSString *str = @"http:&&www.520it.com&img&lnj.gif";
// OccurrencesOfString: 要替換誰
// withString: 用誰替換
NSString *newStr = [str stringByReplacingOccurrencesOfString:@"&" withString:@"/"];
NSLog(@"newStr = %@", newStr);
*/
/*
// 1.去除空格 2.將&替換為/
NSString *str = @" http: &&www. 520it.com &img&lnj.gif ";
// 1.去除空格
NSString *newStr = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"newStr = |%@|", newStr);
NSString *newStr2 = [newStr stringByReplacingOccurrencesOfString:@"&" withString:@"/"];
NSLog(@"newStr2 = |%@|", newStr2);
*/
// 3.替換首尾 set的用法 專門去除首尾的空格,大恍箭,小寫字母刻恭,*號等等
// NSString *str = @" http:&&www.520it.com&img&lnj.gif ";
NSString *str = @"HTTP://www.520it.com/img/LNJ.GIF";
// NSCharacterSet *set = [NSCharacterSet whitespaceCharacterSet]; 去首尾的空格
// NSString *newStr = [str stringByTrimmingCharactersInSet:set];
// 去除首尾的大寫字母
NSCharacterSet *set = [NSCharacterSet uppercaseLetterCharacterSet];
NSString *newStr = [str stringByTrimmingCharactersInSet:set];
NSLog(@"newStr = |%@|", newStr);
return 0;
}
7,字符串與路徑
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
NSString *str = @"User/lnj/Desktop/lnj.txt.jpg";
// 1.判斷是否是絕對路徑
/*
// 其實(shí)本質(zhì)就是判斷字符串是否以/開頭
if([str isAbsolutePath])
{
NSLog(@"是絕對路徑");
}else{
NSLog(@"不是絕對路徑");
}
*/
// 2.獲取文件路徑中的最后一個(gè)目錄
// 本質(zhì)就是獲取路徑中最后一個(gè)/后面的內(nèi)容
/*
NSString *newStr = [str lastPathComponent];
NSLog(@"%@", newStr);
*/
// 3.刪除文件路徑中的最后一個(gè)目錄
/*
// 本質(zhì)就是刪除最后一個(gè)/后面的內(nèi)容, 包括/也會被刪除
NSString *newStr = [str stringByDeletingLastPathComponent];
NSLog(@"%@", newStr);
*/
// 4.給文件路徑添加一個(gè)目錄
/*
// 本質(zhì)就是在字符串的末尾加上一個(gè)/ 和指定的內(nèi)容
// 注意: 如果路徑后面已經(jīng)有了/, 那么就不會添加了
// 如果路徑后面有多個(gè)/, 那么會自動刪除多余的/, 只保留一個(gè)
NSString *newStr = [str stringByAppendingPathComponent:@"xmg"];
NSLog(@"%@", newStr);
*/
// 5.獲取路徑中文件的擴(kuò)展名
/*
// 本質(zhì)就是從字符串的末尾開始查找., 截取第一個(gè).后面的內(nèi)容
NSString *newStr = [str pathExtension];
NSLog(@"%@", newStr);
*/
// 6.刪除路徑中文件的擴(kuò)展名
/*
// 本質(zhì)就是從字符串的末尾開始查找.,刪除第一個(gè).和.后面的內(nèi)容
NSString *newStr = [str stringByDeletingPathExtension];
NSLog(@"%@", newStr);
*/
// 7.給文件路徑添加一個(gè)擴(kuò)展名
// 本質(zhì)就是在字符串的末尾加上一個(gè).和指定的內(nèi)容
NSString *newStr = [str stringByAppendingPathExtension:@"jpg"];
NSLog(@"%@", newStr);
return 0;
}
8季惯,字符串的轉(zhuǎn)換
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
// NSString *str = @"abc";
// 1.將字符串轉(zhuǎn)換為大寫
/*
NSString *newStr = [str uppercaseString];
NSLog(@"%@", newStr);
*/
// 2.將字符串轉(zhuǎn)換為小寫
/*
NSString *newStr2 = [newStr lowercaseString];
NSLog(@"%@", newStr2);
// htpp://www.520it.com/img/lnj.GIF;
*/
// 3.將字符串的首字符轉(zhuǎn)換為大寫
/*
NSString *newStr = [str capitalizedString];
NSLog(@"%@", newStr);
*/
// 4.字符串與基本數(shù)據(jù)類型的轉(zhuǎn)換
/*
NSString *str1 = @"110";
NSString *str2 = @"120";
// str1 + str2; // 錯(cuò)誤
int value1 = [str1 intValue];
int value2 = [str2 intValue];
NSLog(@"sum = %i", value1 + value2);
// 注意: 如果不是int,double,float,bool,integer,longlong這些類型就不要亂用
NSString *str3 = @"abc";
int value3 = [str3 intValue];
NSLog(@"value3 = %i", value3);
*/
// 5.C語言字符串和OC字符串之間的轉(zhuǎn)換
/*
char *cStr = "lnj";
NSString *str = [NSString stringWithUTF8String:cStr];
NSLog(@"str = %@", str);
NSString *newStr = @"lmj";
const char *cStr2 = [newStr UTF8String];
NSLog(@"cStr2 = %s", cStr2);
*/
return 0;
}
9吠各,NSMutableString基本概念
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
/*
NSString *str = @"lnj"; // 一開始str指向@"lnj"對應(yīng)的內(nèi)存
str = @"lmj"; // 修改了str指針的指向, 讓它指向@"lmj"對應(yīng)的內(nèi)存
NSString *newStr = [str stringByReplacingOccurrencesOfString:@"l" withString:@"X"];
NSLog(@"%@", newStr);
*/
// 創(chuàng)建一個(gè)空的字符串
NSMutableString *str = [NSMutableString string];
NSLog(@"修改前: %@", str);
[str appendString:@"lnj"];
NSLog(@"修改后: %@", str);
NSMutableString *strM = [[NSMutableString alloc] init];
// strM = [NSMutableString alloc] initWithFormat:<#(NSString *), ...#>
// strM = [NSMutableString stringWithFormat:<#(NSString *), ...#>]
return 0;
}
10,NSMutableString常用方法
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
NSMutableString *strM = [NSMutableString stringWithFormat:@"www.520it.com.520"];
// 1.在字符串后面添加/image
/*
[strM appendString:@"/image"];
// [strM appendFormat:@"/age is %i", 10];
NSLog(@"strM = %@", strM);
*/
// 2.刪除字符串中的520
/*
// 技巧: 在開發(fā)中, 我們經(jīng)常利用rangeOfString和deleteCharactersInRange方法配合起來刪除指定的字符串
// 2.1先查找出520在字符串中的位置
NSRange range = [strM rangeOfString:@"520"];
// 2.2刪除520
[strM deleteCharactersInRange:range];
NSLog(@"strM = %@", strM);
*/
// 3.在520前面插入love這個(gè)單詞
/*
// insertString : 需要插入的字符串
// atIndex: 從哪里開始插入
NSRange range = [strM rangeOfString:@"520"];
[strM insertString:@"love" atIndex:range.location];
NSLog(@"strM = %@", strM);
*/
// 4.要求將字符串中的520替換為530
// 注意: 如果是調(diào)用NSString的字符串替換方法, 不會修改原有字符串, 而是生成一個(gè)新的字符串
// NSString *newStr =[strM stringByReplacingOccurrencesOfString:@"520" withString:@"530"];
// 注意: 一般情況下OC方法要求傳入一個(gè)參數(shù)如果沒有*, 大部分都是枚舉
// 一般情況下如果不想使用枚舉的值, 可以傳入0, 代表按照系統(tǒng)默認(rèn)的方式處理
// OccurrencesOfString: 需要替換的字符串
// withString: 用什么替換
// options: 替換時(shí)的搜索方式
// range: 搜索的范圍
// 返回值: 代表替換了多少個(gè)字符串
NSUInteger count = [strM replaceOccurrencesOfString:@"520" withString:@"530" options:0 range:NSMakeRange(0, strM.length)];
NSLog(@"strM = %@", strM);
NSLog(@"count = %lu", count);
// NSLog(@"newStr = %@", newStr);
return 0;
}
11勉抓,NSMutableString的練習(xí)
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
/*
需求: 將3個(gè)520it拼接在一起, 中間用空格隔開
520it 520it 520it
*/
NSString *subStr = @"520it";
/*
// 520it-
NSString *newStr = [subStr stringByAppendingString:@" "];
// 520it-520it
newStr = [newStr stringByAppendingString:subStr];
// 520it-520it-
newStr = [newStr stringByAppendingString:@" "];
// 520it-520-520it
newStr = [newStr stringByAppendingString:subStr];
*/
/*
// 注意: 在開發(fā)中如果需要對字符串進(jìn)行頻繁的操作, 不要使用不可變的字符串
NSString *newStr = [subStr stringByAppendingString:@" "];;
for (int i = 0; i < 2; ++i) {
newStr = [newStr stringByAppendingString:subStr];
newStr = [newStr stringByAppendingString:@" "];
}
// 多了一個(gè)空格贾漏,第一種做法是替換最后一個(gè)空格
// 第二種做法是去掉首尾的空格的set來做
// newStr = [newStr stringByReplacingCharactersInRange:NSMakeRange(newStr.length -1 , 1) withString:@""];
newStr = [newStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSLog(@"newStr = |%@|", newStr);
*/
// 創(chuàng)建一個(gè)空得字符串
NSMutableString *strM = [NSMutableString string];
for (int i = 0; i < 3; ++i) {
// 1.添加一個(gè)520it
[strM appendString:subStr];
// 2.添加一個(gè)空格
[strM appendString:@" "];
}
[strM deleteCharactersInRange:NSMakeRange(strM.length - 1, 1)];
NSLog(@"strM = |%@|", strM);
return 0;
}