NSVlue
—————-
1. 延展
2. block
3. 协议
1).
02-NSString
1. 框架: 就是系统(苹果)或者第三方(其他的一些高手)事先写好了一些很牛X功能的类.
Foundation框架: 是1个包 这里面有很多类、函数、定义了一些数据类型.
这个框架中的类都是一些最基础的类. NSString NSObject
……
2. Foundation框架中的最常用的类. 简单的爆.量大.
3. NSString
1). NSString是1个数据类型.保存OC字符串的.
NSString *str1 = [NSString new];
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [NSString string];
2). NSString是OC中最常用的1个类了.所以OC提供了一种更为快速的创建字符串对象的方式.
使用前缀@
@”jack“; 本质上这是1个NSString对象.这个NSString对象中存储的是”jack“这个字符串.
NSString *str1 = @"rose";
1). @”rose“本质上是1个NSString对象,这个对象中存储的是字符串“rose“.
4. NSString的恒定性.
1). 当我们使用简要的创建字符串对象的时候.也就是使用1个OC字符串常量来初始化字符串指针的时候.
NSString *str = @"jack";
NSString *str = [NSString stringWithFormar:@"jack"];
NSString *str1 = [NSString new];
2). 当在内存中创建1个字符串对象以后.这个字符串对象的内容就无法更改.
当我们重新为字符串指针初始化值的时候.并不是修改原来的字符串对象
而是重新的创建1个字符串对象 将这个字符串对象的地址重新复制给字符串指针变量.
3). 当系统准备要在内存中创建字符串对象的时候.会先检查内存中是否有相同内容的字符串对象.
4). 存储在常量区的数据不会被回收. 所以存储在常量区的字符串对象也不会被回收.
03-NSString常用成员
2. 使用频率最最高的几个方法.
1). 使用拼接的方式创建1个NSString对象.
+ (instancetype)stringWithFormat:(NSString *)format, ...
2). 得到字符串的长度.
@property (readonly) NSUInteger length;
3). 得到字符串中指定下标的字符.
- (unichar)characterAtIndex:(NSUInteger)index;
int age = 10 ;
NSString * str = @"王大锤";
//+ (instancetype)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
//类方法: 使用拼接的方式创建1个NSString对象
NSString * newStr = [NSString stringWithFormat:@"大家好我叫%@,我今年%d岁",str,age];
NSLog(@"【newStr】= %@",newStr);
//@property (readonly) NSUInteger length;
//属性:length(得到字符串长度)
NSUInteger len = newStr.length;
NSLog(@"【newStr 字符串长度为】= %lu",len);
//- (unichar)characterAtIndex:(NSUInteger)index;
//方法:characterAtIndex(得到字符串中制定下标的字符)
unichar ch = [newStr characterAtIndex:1];
NSLog(@"【newStr字符串中下标为1的个字符是】= %C", ch);
4). 判断两个字符串的内容是否相同.
a. 能否使用 == 来判断两个OC字符串的内容是否相同.(不能)
-> 10 == 10 这个时候直接比较的是左右两边的数据是否相同.
-> a == b 两边也可以写1个变量.这个时候比较是左右两边的变量的值是否相同.
-> 如果两边是1个指针变量.那么比较的也是变量的值. 只不过指针变量的值是地址.
c. 所以,如果我们要比较两个OC字符串的内容是否相同.不能使用 == 去比较.
因为 == 比较的是字符串指针变量的值.而我们要比的是两个字符串指针指向的字符串对象的内容是否相同.
- (BOOL)isEqualToString:(NSString *)aString;
#define logBOOL(var) NSLog(@"%@",var==YES?@"YES":@"NO");
int main(int argc, const char * argv[]) {
NSString * str1 = @"王大锤";
NSString * str2 = [NSString stringWithFormat:@"王大锤"];
//- (BOOL)isEqualToString:(NSString *)aString;
//比较当前字符串对象和传入的字符串对象的内容是否相同
BOOL res = [str1 isEqualToString:str2];
logBOOL(res);
return 0;
}
+ (nullable instancetype)stringWithUTF8String:(const char *)nullTerminatedCString;
Person * p1 = [Person new];
printf("请输入姓名:");
char str[10];
scanf("%s",str);
//+ (nullable instancetype)stringWithUTF8String:(const char *)nullTerminatedCString;
//将C语言的字符串转换为OC字符串对象
p1.name = [NSString stringWithUTF8String:str];
NSLog(@"p1.name = %@",p1.name);
6). 将OC字符串对象转换为C语言的字符串.
@property (nullable, readonly) __strong const char *UTF8String NS_RETURNS_INNER_POINTER;
// Convenience to return null-terminated UTF8 representation
//将OC字符串对象转换为C语言的字符串.
NSString * str = @"王大锤";
//@property (nullable, readonly) __strong const char *UTF8String NS_RETURNS_INNER_POINTER; // Convenience to return null-terminated UTF8 representation
//将OC字符串对象转换为C语言的字符串.
const char * cstr = str.UTF8String;
printf(" %s n",cstr);
04-NSString类的常用方法
1. 将字符串写入到指定的文件中.
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
[如果为YES则会先创建 1 个临时文件,将内容写到这个临时文件中.如果成功再将临时文件拷贝到指 定的目录. 这样做的好处是安全,不易出错.但是效率较低. 如果为 NO,直接将字符串写到指定的文件之中.这样写不 安全 但是效率高. 建议使用 NO.]
第3个参数: 以哪种字符编码将字符串数据写入到文件,这里传入:NSUTF8StringEncoding
第4个参数: 二级指针.传入1个 NSError 的1个二级指针.
[如果方法执行成功.则方法执行完毕之后. 这个 NSError 的指针的值为 nil 如果方法执行失败.则方法执行完毕之后 这个 NSErro 指针会指向 1 个错误对象. 可以打印这个错误对象得到发生错误的详细信息.
调用 NSError 对象的 localizedDescription 方法 可以拿到发生错误的简要发生原因.
所以,判断是否写入成功就可以判断这个 NSError 指针是否为 nil 如果为 nil 说明写入成功,如果不为 nil 就说明写入失败.]
NSString * str = @"号外号外:刘铁柱暴打王大锤!"; NSError *err; //- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error; // 将字符串写入到指定的文件中. BOOL res =[str writeToFile:@"/Users/babylon/Desktop/code/day9_oc/day09/day09/haowai.txt" atomically:NO encoding:NSUTF8StringEncoding error:&err]; //第一种判断方式: NSLog(@"%@",res==YES?@"写入成功!":@"写入失败!"); //第二种判断方式: if (err != Nil) { NSLog(@"%@",err.localizedDescription); } else{ NSLog(@"写入成功~"); }
2. 将文件中的内容读取到字符串中.
+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
NSError *err;
//+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
//将文件中的内容读取到字符串中.
NSString * str =[NSString stringWithContentsOfFile:@"/Users/babylon/Desktop/code/day9_oc/day09/day09/haowai.txt" encoding:NSUTF8StringEncoding error:&err];
if (err != Nil) {
NSLog(@"%@",err.localizedDescription);
}
else{
NSLog(@"%@",str);
}
3. 使用NSURL读写资源.
1). NSURL对象. 专门用来保存资源地址的. 资源地址: 本地磁盘路径、网页地址、ftp文件地址.
2). 资源路径的地址的写法:
如果要讲1个资源路径的地址保存到NSURL对象中 地址一定要是标准写法.
3). 如何将资源地址存储到NSURL对象中.
NSURL *url1 = [NSURL URLWithString:@”https://www.baidu.com/”];
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;
第 1 个参数: 封装了地址的 NSURL 对象
第 2 个参数: 编码方式,一般传递 NSUTF8StringEncoding第 3 个参数: 二级指针.传入 1 个 NSError 的 1 个二级指针.
如果方法执行成功.则方法执行完毕之后. 这个 NSError 的指针的值为 nil
如果方法执行失败.则方法执行完毕之后 这个 NSErro 指针会指向 1 个错误对象.可以打印这个错误对象得 到发生错误的详细信息.
所以,判断是否读取成功就可以判断这个 NSError 指针是否为 nil 如果为 nil 说明读取成功,如果不为 nil 就说明读取失败.
返回值.为读取到的字符串数据.如果 NSURL 对象中保存的地址是本地文件的地址.就会去指定的本地文件中读取字符串数据. 如果 NSURL 对象中保存的地址是 1 个网页地址.就会去下载这个网页的源代码.
如果 NSURL 对象中保存的地址是 1 个 ftp 文件地址.就会去下载这个文件的内容.
NSError *err;
NSURL * u1 = [NSURL URLWithString:@"https://blog.csdn.net/panjiye82/"];
//+ (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
//读取 NSURL 对象中保持的路径的文件数据.
NSString * htmlcode = [NSString stringWithContentsOfURL:u1 encoding:NSUTF8StringEncoding error:&err];
if (err != nil) {
NSLog(@"%@",err.localizedDescription);
}
else{
NSLog(@"%@",htmlcode);
}
5).向 NSURL 对象保持的地址写入字符串数据.
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
第1个参数: 封装了地址的 NSURL 对象.
第2个参数: 保证原子性.
[如果为YES则会先创建 1 个临时文件,将内容写到这个临时文件中.如果成功再将临时文件拷贝到指 定的目录. 这样做的好处是安全,不易出错.但是效率较低. 如果为 NO,直接将字符串写到指定的文件之中.这样写不 安全 但是效率高. 建议使用 NO.]
第3个参数: 以哪种字符编码将字符串数据写入到文件,这里传入:NSUTF8StringEncoding
第4个参数: 二级指针.传入1个 NSError 的1个二级指针.
[如果方法执行成功.则方法执行完毕之后. 这个 NSError 的指针的值为 nil 如果方法执行失败.则方法执行完毕之后 这个 NSErro 指针会指向 1 个错误对象. 可以打印这个错误对象得到发生错误的详细信息.
调用 NSError 对象的 localizedDescription 方法 可以拿到发生错误的简要发生原因.
所以,判断是否写入成功就可以判断这个 NSError 指针是否为 nil 如果为 nil 说明写入成功,如果不为 nil 就说明写入失败.]
NSError *err;
NSURL * u1 = [NSURL URLWithString:@"file:///Users/babylon/Desktop/code/day9_oc/day09/day09/haowai.txt"];
NSString * str = @"最新消息,最新消息:刘铁柱暴打王大锤不成,王大锤反杀刘铁柱!!";
//- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
//向 NSURL 对象保持的地址写入字符串数据.
BOOL res = [str writeToURL:u1 atomically:NO encoding:NSUTF8StringEncoding error:&err];
//第一种判断方式:
NSLog(@"%@",res==YES?@"写入成功!":@"写入失败!");
//第二种判断方式:
if (err != nil) {
NSLog(@"%@",err.localizedDescription);
}
else{
NSLog(@"写入成功!");
}
4. 字符串比较.
- (NSComparisonResult)compare:(NSString *)string;
NSString *str1 = @"王大锤";
NSString *str2 = @"刘铁柱";
//- (NSComparisonResult)compare:(NSString *)string;
// (对象方法) 字符串比较.
NSComparisonResult res = [str1 compare:str2];
//typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};
switch (res) {
case NSOrderedAscending:
//说明str1比str2小
NSLog(@"小");
break;
case NSOrderedDescending:
//说明str1比str2大
NSLog(@"大");
break;
case NSOrderedSame:
NSLog(@"相等");
//说明相等
break;
}
5. 字符串比较:忽略大小写的比较:
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
NSString *str1 = @"Jack";
NSString *str2 = @"jack";
//- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
// (对象方法) 字符串比较(带选项).
NSComparisonResult res = [str1 compare:str2 options:NSCaseInsensitiveSearch];
//Case Insensitive 不区分大小写
switch (res) {
case NSOrderedAscending:
//说明str1比str2小
NSLog(@"小...");
break;
case NSOrderedDescending:
//说明str1比str2大
NSLog(@"大....");
break;
case NSOrderedSame:
NSLog(@"相等...");
//说明相等
break;
}
typedef NS_OPTIONS(NSUInteger, NSStringCompareOptions) { NSCaseInsensitiveSearch = 1, //不区分大小写 NSLiteralSearch = 2, /* 逐个字符精确比对 */ NSBackwardsSearch = 4, /* Search from end of source string */ NSAnchoredSearch = 8, /* Search is limited to start (or end, if NSBackwardsSearch) of source string */ NSNumericSearch = 64, /*字符串里面数字的比较*/ NSDiacriticInsensitiveSearch NS_ENUM_AVAILABLE(10_5, 2_0) = 128, /* If specified, ignores diacritics (o-umlaut == o) */ NSWidthInsensitiveSearch NS_ENUM_AVAILABLE(10_5, 2_0) = 256, /* If specified, ignores width differences ('a' == UFF41) */ NSForcedOrderingSearch NS_ENUM_AVAILABLE(10_5, 2_0) = 512, /* If specified, comparisons are forced to return either NSOrderedAscending or NSOrderedDescending if the strings are equivalent but not strictly equal, for stability when sorting (e.g. "aaa" > "AAA" with NSCaseInsensitiveSearch specified) */ NSRegularExpressionSearch NS_ENUM_AVAILABLE(10_7, 3_2) = 1024 /* Applies to rangeOfString:..., stringByReplacingOccurrencesOfString:..., and replaceOccurrencesOfString:... methods only; the search string is treated as an ICU-compatible regular expression; if set, no other options can apply except NSCaseInsensitiveSearch and NSAnchoredSearch */ };
7. 判断字符串是否以指定的字符串开头
- (BOOL)hasPrefix:(NSString *)str;
NSString * str = @"http://www.csdn.com/";
//- (BOOL)hasPrefix:(NSString *)str;
//方法对象 是否以指定字符串开头
BOOL res = [str hasPrefix:@"http://"];
if (res == NO ) {
res = [str hasPrefix:@"https://"];
}
NSLog(@"%@",res == YES?@"字符串是网址":@"字符串不是网址");
8. 判断字符串是否以指定的字符串结尾
- (BOOL)hasSuffix:(NSString *)str;
NSString *path = @"/Users/Apple/Download/王大锤大战刘铁柱.avi";
//- (BOOL)hasSuffix:(NSString *)str;
//方法对象 是否以指定的字符串结尾
BOOL res = [path hasSuffix:@".mp3"];
NSLog(@"%@",res == YES?@"文件后缀是mp3":@"文件后缀不是mp3");
9. 在主串中搜索子串.从前往后
- (NSRange)rangeOfString:(NSString *)searchString;
NSString *str = @"刘铁柱表示:王大锤大战刘铁柱将在下周五播出!";
//- (NSRange)rangeOfString:(NSString *)searchString;
NSRange range = [str rangeOfString:@"刘铁柱"];
/*
typedef struct _NSRange {
NSUInteger location; //子串在主串中首次出现的下标
NSUInteger length; //子串在主串中匹配的长度
} NSRange;
*/
NSLog(@"%@",range.length == 0 ?@"没找到字符串":@"已找到字符串" );
NSLog(@"location = %lu location = %lu",range.location,range.length);
NSUInteger location; //代表子串在主串出现的下标.
NSUInteger length; //代表子串在主串中匹配的长度.
} NSRange;
location 为NSUInteger的最大值, 也就是NSNotFound
length 的值为0
NSString *str = @"刘铁柱表示:王大锤大战刘铁柱将在下周五播出!";
//- (NSRange)rangeOfString:(NSString *)searchString;
NSRange range = [str rangeOfString:@"!刘铁柱!"];
/*
typedef struct _NSRange {
NSUInteger location; //子串在主串中首次出现的下标
NSUInteger length; //子串在主串中匹配的长度
} NSRange;
*/
if (range.location == NSNotFound)
//static const NSInteger NSNotFound = NSIntegerMax;
//9223372036854775807
{
NSLog(@"没有找到字符串~");
}
else{
NSLog(@"已找到字符串");
}
NSLog(@"%@",range.length == 0 ?@"没找到字符串":@"已找到字符串" );
NSLog(@"location = %lu location = %lu",range.location,range.length);
return 0 ;
}
10.在主串中搜索子串.从后往前.
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;
NSString *str = @"刘铁柱表示:王大锤大战刘铁柱将在下周五播出!";
//- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;
// 在主串中搜索子串 -> 从后往前(NSBackwardsSearch).
NSRange range = [str rangeOfString:@"刘铁柱" options:NSBackwardsSearch];
if (range.location == NSNotFound)
{
NSLog(@"没有找到字符串~");
}
else{
NSLog(@"已找到字符串");
}
NSLog(@"location = %lu location = %lu",range.location,range.length);
11. NSRange结构体.
1). 是Foundation框架中定义的1个结构体.
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
NSRange range;
这个结构体变量一般情况下用来表示1段范围.特别用在子串在主串中的范围表示.
4 4
NSRange range = {4, 4};
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);
5). Foundation框架中定义了1个函数 可以将1个NSRange结构体变量转换为NSString
NSStringFromRange(ran) 函数可以将NSRange结构体变量转换为指定格式的字符串.
05-字符串的常用成员
1. 字符串的截取.
取到字符串中的1部分.
1.1 (对象方法)从指定的下标出一直截取到最后。
- (NSString *)substringFromIndex:(NSUInteger)from;
NSString * str = @"板凳宽扁担长,扁担非要绑在板凳上,板凳不让扁担绑在板凳上";
NSString * newStr = str;
NSUInteger i = 0 ;
int x = 0;
do
{
NSRange range = [newStr rangeOfString:@"扁担"];
if (range.length != 0)
{
x++ ;
i = i + range.location; //要搜索的文字出现的位置
NSLog(@"第[%d]次出现,下标为%lu",x,i);
i = i + range.length; //要截取掉前面的文字数
//- (NSString *)substringFromIndex:(NSUInteger)from;
//(对象方法)从指定的下标出一直截取到最后.
newStr = [str substringFromIndex: i];
}
}
while (str.length != 0);
NSLog(@"扁担在字符串中出现的次数为:%d", x );
1.2 从第0个开始截取指定的个数
- (NSString *)substringToIndex:(NSUInteger)to; 从第0个开始截取指定的个数.
NSString * str = @"板凳宽扁担长,扁担非要绑在板凳上,板凳不让扁担绑在板凳上";
//- (NSString *)substringToIndex:(NSUInteger)to;
//(对象方法) 从第0个开始截取指定的个数.
NSLog(@"%@",[str substringToIndex:6]);
1.3 截取指定的1段范围.
- (NSString *)substringWithRange:(NSRange)range;
NSString * str = @"板凳宽扁担长,扁担非要绑在板凳上,板凳不让扁担绑在板凳上";
//- (NSString *)substringWithRange:(NSRange)range;
//截取指定的1段范围.
NSLog(@"%@",[str substringWithRange:NSMakeRange(7, 9)]);
2. 字符串的替换
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement NS_AVAILABLE(10_5, 2_0);
/* Replace characters in range with the specified string, returning new string.
*/
将字符串中第1个参数替换为第2个参数.
友情提示: 原来的指针指向字符串的内容是不会变的,会全部替换.
新串是以方法的返回值返回的.
NSString * str = @"板凳宽扁担长,扁担非要绑在板凳上,板凳不让扁担绑在板凳上";
//- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement NS_AVAILABLE(10_5, 2_0);
// Replace characters in range with the specified string, returning new string.
//将字符串中第1个参数替换为第2个参数.返回一个新的字符串
NSString * newStr = [str stringByReplacingOccurrencesOfString:@"扁担" withString:@"刘铁柱"];
NSLog(@"%@", newStr);
3. 字符串数据转换为其他的类型. 使用频率很高.
@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
转换注意. 从头开始转换,能转换多少就是多少. 到遇到不能转换的时候就停止转换.
4. 去掉字符串前后的空格/大/小写字母/去掉指定字符串等.
4.1 去掉字符串前后空格(中间的空格无法去掉.)
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
NSString * str = @" (_刘铁柱 锤爆 王大锤_) ";
//- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
//NSCharacterSet
// whitespaceCharacterSet 删除字符串前后空格
NSString * newStr =
[str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
//characterSetWithCharactersInString 自定义删除的字符,包含在字符串里的就会删除
NSString * newStr1 =
[newStr stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"@/:();()¥「」"、[]{}#%-*+=_\|~<>$€^•'@#$%^&*()_+'""]];
NSLog(@"处理前:[%@]",str);
NSLog(@"删除空格处理后:[%@]",newStr);
NSLog(@"去除符号处理后:[%@]",newStr1);
4.2 去掉字符串前后的小写字母
参数:lowercaseLetterCharacterSet
NSString * str = @"abcabc I love U abcabc";
//- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
//lowercaseLetterCharacterSet 去掉字符串前后小写字母
NSString * newStr =
[str stringByTrimmingCharactersInSet:[NSCharacterSet lowercaseLetterCharacterSet]];
NSLog(@"处 理 前:[%@]",str);
NSLog(@"删除字符串前后小写字母处理后:[%@]",newStr);
return 0 ;
4.3 去掉字符串前后的大写字母
参数:uppercaseLetterCharacterSet
NSString * str = @"ABC I love U ABC";
//- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
//uppercaseLetterCharacterSet 去掉字符串前后大写字母
NSString * newStr =
[str stringByTrimmingCharactersInSet:[NSCharacterSet uppercaseLetterCharacterSet]];
NSLog(@"处 理 前:[%@]",str);
NSLog(@"删除字符串前后大写字母处理后:[%@]",newStr);
4.4 去掉字符串前后指定的字符串
参数:characterSetWithCharactersInString 去掉字符串前后特定字符(设置字符串内包含的字符)
NSString * str = @"(_@ I love U @_)";
//- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
//characterSetWithCharactersInString 去掉字符串前后特定字符(设置字符串内包含的字符)
NSString * newStr =
[str stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"@/:();()¥「」"、[]{}#%-*+=_\|~<>$€^•'@#$%^&*()_+'""]];
NSLog(@"处 理 前:[%@]",str);
NSLog(@"删除字符串前后特定字母处理后:[%@]",newStr);
5.将字符串转换为大写/小写字符串
@property (readonly, copy) NSString *uppercaseString;
@property (readonly, copy) NSString *lowercaseString;
属性:uppercaseString 字符串内字母全部转换大写
属性:lowercaseString 字符串内字母全部转换小写
属性: capitalizedString 字符串内每个单词字母首字母大写,其它字母小写。
NSString * str = @"I love U";
//@property (readonly, copy) NSString *uppercaseString;
//@property (readonly, copy) NSString *lowercaseString;
NSString *upper = str.uppercaseString;
NSString *lower = str.lowercaseString;
NSLog(@"%@转换大写后%@",str,upper);
NSLog(@"%@转换小写后%@",str,lower);
NSString * str = @"Administrators, commonly known as admins or sysops (system operators), are Wikipedia editors who have been granted the technical ability to perform certain special actions on the English Wikipedia. These include the ability to block and unblock user accounts, IP addresses, and IP ranges from editing, edit fully protected pages, protect and unprotect pages from editing, delete and undelete pages, rename pages without restriction, and use certain other tools.";
NSString * lower = str.lowercaseString;
NSString * upper = str.uppercaseString;
NSLog(@"%@ n 单词首字母大写后:%@", lower,lower.capitalizedString);
NSLog(@"%@ n 单词首字母大写后:%@",upper,upper.capitalizedString);
06-NSMutableString
1. 字符串的恒定性.
一旦创建1个字符串对象,那么这个字符串对象的内容就无法更改, 当我们修改字符串的时候, 其实是重新的创建了1个字符串对象.
NSLog(@"-------------------");
NSString *str = @""; //@""
for(int i = 0; i < 50000; i++)
{
str = [NSString stringWithFormat:@"%@%d",str,i];
}
NSLog(@"-------------------");
会耗费很长的时间. 每次循环的时候 都会创建1个新的字符串对象.50000个,
因为字符串的恒定性.
2. 如何让这样的大批量的字符串拼接可以更加快速的1点.
1). 慢得原因: 因为字符串的恒定性,每次修改字符串的时候,是重新的创建1个对象,
2). 希望: 有没有一种对象是用来存储字符串的,并且存储在这个对象中的字符串数据可以更改.
3. NSMutableString
1). 是Foundation框架中的1个类.从NSString继承.
所以,NSMutableString对象是用来存储字符串数据的.
2). NSMutbaleString在父类NSString的基础之上的做扩展.
存储在NSSMutableString对象中的字符串数据可以更改.具备可变性.
直接可以改存储在NSMutableStirng对象中的字符串数据,不会新创建对象.
4. NSMutableString的用法
1). 既然是1个类,要使用的话,就得创建1个对象.
NSMutableString *str = [NSMutableString string];
2). 往可变字符串对象中追加字符串.
– (void)appendString:(NSString *)aString; //直接追加内容.
- (void)appendString:(NSString *)aString; //直接追加内容.
– (void)appendFormat:(NSString *)format, … 以拼接的方式往可变字符串对象中追加内容.
- (void)appendFormat:(NSString *)format, ... //以拼接的方式往可变字符串对象中追加内容.
NSMutableString * str = [NSMutableString string];
int age = 10;
[str appendFormat:@"我叫%@,我今年%d岁",@"jack",age];
NSLog(@"%@",str);
return 0 ;
3). 创建NSMutableString对象的时候,记住下面这样的初始化方式是不行的.
NSMutableString *str = @”jack”;
@”jack” 是1个NSString对象,是1个父类对象.
而str指针是1个NSMutableString类型的 是1个子类类型的.
4). NSMutableString从NSString继承.
在使用NSString的地方完全可以使用NSMutableString
5. 使用NSMutableString来做大批量的字符串拼接.
NSLog(@"~~~~~~~~~~~~");
NSMutableString *str = [NSMutableString string];
for(int i = 0; i < 100000; i++)
{
[str appendFormat:@"%d",i];
}
NSLog(@"~~~~~~~~~~~~");
这个时候 “biu”的一下就结束了. 为什么这么快>? 因为NSMutableString只有1个.每次修改的时候 直接修改的是这个对象中的数据.
6. 使用建议
1). 我们平时使用的时候,还是使用NSString. 因为效率高.
NSString *str1 = @”jack”;
NSString *str2 = @”jack”;
2). NSMutbaleString: 只在做大批量的字符串拼接的时候才使用.
大量拼接的时候,就不要去使用NSString 因为效率低下.(10次以上.)
07-NSArray
1. 回忆C语言中的数组
特点:
a. 存储多个数据.
b. 类型相同.
d. 每1个元素都是紧密相连的.
2. NSArray
1). 是Foundation框架中的一个类.这个类的对象是来存储多个数据的,具备数组的功能.
所以,NSArray是OC中的数组.
2). 特点:
a. 只能存储OC对象.任意的OC对象 (无法存储非OC对象的数据)
b. 长度固定. 一旦NSArray数组创建完毕之后,元素的长度固定,无法新增 无法删除元素.
c. 每1个元素都是紧密相连的. 每1个元素仍然有自己的下标.
3. NSArray数组的创建.
1). 因为这是1个类,所以当然就是创建NSArray对象.
NSArray *arr1 = [NSArray new];
NSArray *arr2 = [[NSArray alloc] init];
NSArray *arr3 = [NSArray array];
这样创建出来的NSArray数组的元素的个数是0个,因为长度固定.所以没有任何意义.
2). 创建数组的同时指定1个数组的元素
+ (instancetype)arrayWithObject:(ObjectType)anObject;
NSArray *arr = [NSArray arrayWithObject:@"jack"];
3). 最常用的创建NSArray数组的方式.
+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ...
//+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
使用注意
1). 只能存储OC对象.不能存储非OC对象.
2). 将元素写完以后,最后要写1个nil 表示元素到此结束了.
4). 创建NSArray数组的简要方式.
NSArray *arr = @[写上每1个元素的值用逗号分隔.];
NSArray * arr = @[@"王大锤",@"刘铁柱",@"Tom",@"Jerry"];
4. NSArray数组的使用.
1). 在NSLog函数中使用%@可以直接输出NSArray对象中的所有的元素的值.
2). NSArray数组中不能存储基本数据类型.不能存储非OC对象.
nil的本质其实就是0 所以nil无法存储到NSArray数组中.
3). 这样创建数组没有任何意义.
NSArray *arr1 = [NSArray new];
NSArray *arr2 = [[NSArray alloc] init];
NSArray *arr3 = [NSArray array];
这些数组是没有元素的 而NSArray数组元素无法新增和删除,所以没有任何意义.
5. 取出存储在NSArray数组中的元素的值.
1). 可以使用下标取出对应的元素的值.
NSArray *arr = @[@"jack",@"rose",@"lili"];
NSLog(@"%@",arr[0]);
NSLog(@"%@",arr[1]);
NSLog(@"%@",arr[2]);
2). 调用数组对象的对象方法来取出指定下标的元素的值.
- (ObjectType)objectAtIndex:(NSUInteger)index;
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
//- (ObjectType)objectAtIndex:(NSUInteger)index;
// 取出指定下标的元素的值
NSLog(@"%@",[arr objectAtIndex:1]);
6. NSArray数组的其他的常用方法
1). 得到NSArray数组中的元素的个数.
@property (readonly) NSUInteger count;
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
//@property (readonly) NSUInteger count;
NSLog(@"%lu",arr.count);
2). 判断NSArray数组中是否包含指定的元素.
- (BOOL)containsObject:(ObjectType)anObject;
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
//- (BOOL)containsObject:(ObjectType)anObject;
BOOL res = [arr containsObject:@"Tom"];
NSLog(@"%@",res == YES ?@"包含元素":@"不包含元素");
3). 取到NSArray数组中的第1个元素.
@property (nullable, nonatomic, readonly) ObjectType firstObject
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
//@property (nullable, nonatomic, readonly) ObjectType firstObject NS_AVAILABLE(10_6, 4_0);
NSLog(@"第一个元素:%@",arr.firstObject);
与arr[0]的区别:
如果数组中没有任何元素.arr[0]报错. firstObject取到nil 不报错.
4). 取到NSArray数组中的最后1个元素.
@property (nullable, nonatomic, readonly) ObjectType lastObject
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
//@property (nullable, nonatomic, readonly) ObjectType lastObject;
NSLog(@"最后一个元素:%@",arr.lastObject);
5). 查找指定的元素在NSArray数组中第一次出现的下标.
- (NSUInteger)indexOfObject:(ObjectType)anObject;
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
//- (NSUInteger)indexOfObject:(ObjectType)anObject;
NSUInteger res = [arr indexOfObject:@"Tom"];
NSLog(@"%@",
res != NSNotFound ? [NSString stringWithFormat:@"元素下标:%lu",res]:@"未找到元素");
如果没有找到 返回的是NSUInteger的最大值(NSNotFound).
7. NSArray数组的遍历.
1). 使用for循环来遍历数组中的每1个元素.
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
for (int i = 0; i < arr.count; i++) {
//NSLog(@"[ %d ]= %@ ",i,arr[i]);
NSLog(@"[ %d ]= %@ ",i,[arr objectAtIndex:i]);
}
2). 使用增强for循环来遍历NSArray数组中的元素.
{
直接通过变量名就可以拿到数组中的每1个元素.
}
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
for(NSString * str in arr)
{
NSLog(@"%@",str);
}
b. 声明在for()中的变量叫做迭代变量.
c. 执行的原理.
…….
-> 迭代变量的类型和数组中的元素的类型保持一致.
-> in是固定的.
-> 遍历哪1个数组,就将数组写在in后面.
当NSArray数组中存储的数据的类型不一致时候 迭代变量的类型建议使用id类型.
3). 使用block遍历.
- (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);
这是1个方法.这个方法的作用就是来遍历数组中的每1个元素.
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
//- (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);
//方法:遍历数组中的每个元素。
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)
{
NSLog(@"%@",obj);
}];
如果想停止遍历,就将第三个参数*STOP改成YES就可以了。
8. NSArray与字符串的两个方法
1). 将数组中的元素连接起来组成1个新的字符串.
- (NSString *)componentsJoinedByString:(NSString *)separator;
参数: 连接符.
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
//- (NSString *)componentsJoinedByString:(NSString *)separator;
//将数组中的元素连接起来组成1个新的字符串. [参数]separator = 连接符
NSString * str = [arr componentsJoinedByString:@"-"];
NSLog(@"%@",str);
2). 将字符串以指定的分隔符分成1个数组. 每1部分就是数组的1个元素.
- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
NSString * str = @"王大锤-刘铁柱-Tom-Jerry";
//- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
//方法 - 将字符串以指定的分隔符分成1个数组. 每1部分就是数组的1个元素.[参数]separator = 分隔符
NSArray * arr = [str componentsSeparatedByString:@"-"];
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"[%lu]%@ [lenth] %lu", idx , obj , [obj length]);
}];
08-description
1. 非常重要的问题
%p : 打印的是指针变量的值.
%@ : 打印的是指针变量指向的对象.
2. 使用NSLog函数 %@ 打印对象的原理.
1). 调用传入的对象的description方法.
description是定义在NSObject协议中的1个方法.因为NSObject类遵守了NSObject协议.
所以,NSObject类中就有这个description方法的实现.
所以.所有的OC对象中都有description方法
这个方法的返回值是NSString字符串.
2). 取到description方法的返回值,然后输出返回值的内容.
3) description方法是NSObject类中实现的.
在NSObject类中的description方法是如何实现的呢?
@”<对象所属的类名:对象的地址>”
4). 如果我们自定义的类不想打印NSObject中description方法的返回值.
而是我自己定义的额.
09-NSMutbaleArray
1. NSMutableArray是NSArray的子类.
1). NSMutableArray仍然是1个数组.具备NSArray数组的特点.
只能存储OC对象.每1个元素的紧密相连的.
2). NSMutableArray相对于父类做的扩展:NSMutableArray数组的元素可以动态的新增和删掉.
其他的用法均与NSArray一致.
所以: NSArray数组一旦创建,其元素的个数就固定,无法新增删除.
NSMutableArray数组.元素可以新增 可以删除. 其他用法和父类一样.
2.NSMutableArray数组的创建.
NSMutableArray * arr1 = [NSMutableArray array];
NSMutableArray * arr2 = [[NSMutableArray alloc]init];
NSMutableArray * arr3 = [NSMutableArray new];
NSMutableArray * arr4 = [NSMutableArray arrayWithObject:@"王大锤"];
这样创建出来的数组对象.数组的元素是0 仍然是有意义的 因为我们可以动态的新增和删除元素.
也可以使用这样的方式来创建可变数组对象.这个数组的元素可以新增和删除.
NSMutableArray * arr5 = [NSMutableArray arrayWithObjects:@"王大锤",@"刘铁柱",nil];
最容易犯错:这样写是不可以的
NSMutableArray *arr5 = @[@"jack",@"rose",@"lili"];
@[@”jack”,@”rose”,@”lili”];这是1个NSArray对象.
arr5是1个子类指针. 子类指针指向父类对象的就有可能会出问题.
———插入———
1. 任意的指针其实可以指向任意的对象. 编译不会报错 只会给1个警告.
2. 虽然语法上可以乱指.但是你千万别乱指.因为运行的适合可能出错.
当我们调用指针类型特有的方法的时候.
————————-
3. 可变数组中新增元素. 将传入的参数作为数组的元素添加进去.
- (void)addObject:(ObjectType)anObject;
4. 将另外1个数组中的每1个元素添加到可变数组中.
- (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;
5. 在可变数组中指定的下标出插入1个元素.
- (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
NSMutableArray * arr = [NSMutableArray array];
NSArray * arr1 =@[@"Jack",@"Rose",@"Lili",@"Tom",@"Jerry"];
// - (void)addObject:(ObjectType)anObject;
[arr addObject:@"王大锤"];
NSLog(@"1.当前元素数:%lu",arr.count);
NSLog(@"%@",arr);
NSLog(@"----------------------------------");
// - (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;
[arr addObjectsFromArray:arr1];
NSLog(@"2.当前元素数:%lu",arr.count);
NSLog(@"%@",arr);
NSLog(@"----------------------------------");
// - (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
[arr insertObject:@"刘铁柱" atIndex:1];
NSLog(@"3.当前元素数:%lu",arr.count);
NSLog(@"%@",arr);
NSLog(@"----------------------------------");
————–
6. 删除可变数组中指定下标的元素.
- (void)removeObjectAtIndex:(NSUInteger)index;
7. 删除可变数组中所有的指定的元素.
- (void)removeObject:(ObjectType)anObject;
8. 删除最后1个元素
- (void)removeLastObject;
9. 替换指定下标元素的值
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject;
10.删除所有的元素
- (void)removeAllObjects
NSMutableArray * arr = [NSMutableArray arrayWithObjects:@"Jack",@"Rose",@"孙大宝",@"刘铁蛋",@"Lili",@"Tom",@"Jerry",@"刘铁蛋",nil];
// - (void)removeObjectAtIndex:(NSUInteger)index; 删除指定下标的元素
NSLog(@"------------删除下标为2的元素【孙大宝】----------");
[arr removeObjectAtIndex:2];
NSLog(@"1.当前元素数:%lun%@n----------------------------------",arr.count,arr);
// - (void)removeObject:(ObjectType)anObject; 删除所有的指定的元素.
NSLog(@"----------删除所有为【刘铁蛋】的元素-------------");//控制显示为:U5218U94c1U86cb
[arr removeObject:@"刘铁蛋"];
NSLog(@"2.当前元素数:%lun%@n----------------------------------",arr.count,arr);
//- (void)removeLastObject; //删除最后一个元素
NSLog(@"------------删除最后一个元素【Jerry】-----------");
[arr removeLastObject];
NSLog(@"4.当前元素数:%lun%@n----------------------------------",arr.count,arr);
// - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject;
//方法 替换指定下表元素的值
NSLog(@"--------将【Lili】替换成【Luckey】-------------");
[arr replaceObjectAtIndex:2 withObject:@"Luckey"];
NSLog(@"5.当前元素数:%lun%@n----------------------------------",arr.count,arr);
//- (void)removeAllObjects; 删除所有的元素.
NSLog(@"------------删除全部元素----------------------");
[arr removeAllObjects];
NSLog(@"6.当前元素数:%lun----------------------------------",arr.count);
8. 删除指定范围中的所有指定元素.
- (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;
NSMutableArray * arr = [NSMutableArray arrayWithObjects:@"Jack",@"Rose",@"刘铁柱",@"Lili",@"刘铁柱",@"Tom",@"刘铁柱",@"Jerry",nil];
NSLog(@"==============原始数组====================");
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"arr[%lu] = %@",idx,obj);
}];
//下标2,4,6 都是刘铁柱,我们要删除第4,第6个。
NSRange range = NSMakeRange(4,3);//(4,5,6)从下标4起,连续3个元素的范围
//- (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;
// 删除指定范围中的所有指定元素.
[arr removeObject:@"刘铁柱" inRange:range];
NSLog(@"==============范围删除后==================");
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"arr[%lu] = %@",idx,obj);
}];
10-NSNumber
1. 无论是NSArray还是NSMutbaleArray里面都只能存储OC对象.
基本数据类型是无法存储的.
2. 如何将基本数据类型的数据存储到NSArray数组中.
定义1个类,这个类的对象的作用是用来存储1个int类型的数据.再将这个对象存储到NSArray数组中.
4. NSNumber是Foundation框架中定义好的1个类.这个类的对象的作用就是用来包装基本数据类型的.
2). 再将NSNumber对象存储到NSArray数组中.
NSNumber *number1 = [NSNumber numberWithFloat:10.1f];
NSNumber *number2 = [NSNumber numberWithFloat:10.2f];
NSNumber *number3 = [NSNumber numberWithFloat:10.3f];
NSArray *arr = @[number1,number2,number3];
for(NSNumber *num in arr)
{
NSLog(@"%f",num.floatValue);
}
NSNumber * num1 = [NSNumber numberWithInt:10];
NSNumber * num2 = [NSNumber numberWithFloat:10.15f];
NSNumber * num3 = [NSNumber numberWithDouble:15.48457];
NSArray * arr = @[num1,num2,num3];
NSLog(@"%@",arr);
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"[%lu]%@",idx,obj);
}];
for(NSNumber * num in arr)
{
NSLog(@"%d % .2lf %f",num.intValue,num.floatValue,num.doubleValue);
}
5. 简写方式.
创建NSNumber对象的简写方式:
NSArray * arr = @[@10,@10.15f,@15.48457];
NSLog(@"%@",arr);
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"[%lu]%@",idx,obj);
}];
for(NSNumber * num in arr)
{
NSLog(@"%d % .2lf %f",num.intValue,num.floatValue,num.doubleValue);
}
@10; 代表是1个NSNumber对象.这个对象中包装的是整形的10
这个不是整形的10
[NSNumber numberWithInt:10];
包装注意:
如果后面的数据是1个变量 那么这个变量就必须要使用小括弧括起来.
@(10);
int num = 10;
@(num)
原文地址:https://blog.csdn.net/panjiye82/article/details/124906746
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_44644.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!