Foundation框架中常用的类有字符串、集合、字典等,这里介绍字符串NSString。本文分别介绍了NSString的创建、从文件里读取NSString字符串、通过函数改变外部的NSString变量的值、NSString字符串的导出、NSString的常用方法等5个部分。

1.NSString的创建:

#pragma mark NSString的创建
void stringCreate() {
// char *s = "A String!"; // C语言中的字符串 // 这种方式创建出来的字符串是不需要释放的
NSString *str1 = @"A String!"; NSString *str2 = [[NSString alloc] init];
str2 = @"A String!";
[str2 release]; NSString *str3 = [[NSString alloc] initWithString:@"A String!"];
[str3 release];
// 不需要管理内存
str3 = [NSString stringWithString:@"A String!"]; NSString *str4 = [[NSString alloc] initWithUTF8String:"A String!"];
[str4 release];
str4 = [NSString stringWithUTF8String:"A String!"]; NSString *str5 = [[NSString alloc] initWithFormat:@"My age is %i and height is %.2f", , 1.55f];//(图1) // 这句代码放在中间会造成2个错误:
// 1.前面创建的字符串没有被释放
// 2.后面创建的字符串会释放过度,造成野指针错误
// str5 = [NSString stringWithFormat:@"My age is %i and height is %.2f", 19, 1.55f];//(图2、3) NSLog(@"str5:%@", str5);
[str5 release]; str5 = [NSString stringWithFormat:@"My age is %i and height is %.2f", , 1.55f];
}

              

(图1)                                                        (图2)                                                           (图3)

  野指针的产生:通过“[[NSString alloc] initWithFormat:@"My age is %i and height is %.2f", 19, 1.55f];”(动态创建)这句创建的对象是需要手动释放内存的,如果在还没有手动释放之前又通过静态方法“str5 = [NSString stringWithFormat:@"My age is %i and height is %.2f", 19, 1.55f];”(静态创建)给str5对象赋值,那么str5将指向新的一块内存,而原来的那块内存没有对象指向它了,但是也没有被释放,就成了野指针。动态方式创建一般都有对应的静态方法创建。

2.从文件里读取NSString字符串

void stringCreate2() {
// 从文件中读取文本
NSString *path = @"/Users/apple/Desktop/test.txt";
// 这个方法已经过期,不能解析中文
// NSString *str1 = [NSString stringWithContentsOfFile:path]; // 定义一个NSError变量
NSError *error;
// 指定字符串编码为UTF-8: NSUTF8StringEncoding
NSString *str1 = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
//最后的一个参数不能传error,一定要传error的地址,它是指向error这个指针的指针
if (error == nil) { // 没有错误信息
NSLog(@"读取文件成功:%@", str1);
} else {
NSLog(@"读取文件失败:%@", error);
} NSURL *url = [NSURL URLWithString:@"file:///Users/apple/Desktop/test.txt"];
NSString *str2 = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", str2); NSURL *url2 = [NSURL URLWithString:@"http://www.baidu.com"];
NSString *str3 = [NSString stringWithContentsOfURL:url2 encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", str3);
}

3.通过函数改变外部的NSString变量的值

先看一种情况:

void test(NSString *str){
str = @"";
} int main(int argc, const char *argv[])
{
autoreleasepool{
NSString *s = @"";
test(s);
NSLog(@"%@", s);
}
return ;
}

  运行结果为:456。s的值并没有改变,分析如下:

  指针变量s起初指向456(图1),当调用test函数时,传入参数s,函数会开辟一块存储空间存储指针变量str,指针变量是存储地址的,参数s将其存储的地址赋值给str(值传递)(图2),因此str存储的地址也指向了456这个对象,“str = @"123";”执行后,系统又开辟了一块存储空间存储123,接着让str指向这个对象(图3)。而s的值根本没有变,它一直都指向456。所以,对于一个函数,如果只是把一个指针传进去,外面的值是不会变的。

(图1)                                                         (图2)                                                                 (图3)

  若要通过函数改变外面指针指向的值,需要用到指针的指针,也就是把外面指针的地址传进去。

void test(NSString **str) {
*str = @"";
// s = @"123";
}
int main(int argc, const char *argv[])
{
autoreleasepool{
NSString *s = @"456";
test(&s);
NSLog(@"%@", s);
}
return 0;
}

  指针变量是这样的,那对于一般类型的变量呢?看下面的例子:

void test2(int p){
p = ;
} int main(int argc, const char * argv[])
{ @autoreleasepool {
int a = ;
test2(a);
NSLog(@"%i", a);
}
return ;
}

  运行结果:10;

void test2(int *p) {
*p = ;
} int main(int argc, const char * argv[])
{ @autoreleasepool {
int a = ;
test2(&a);
NSLog(@"%i", a);
}
return ;
}

  运行结果:9。

  效果是一样的。再次说明,如果要设计一个方法,改变外面传进来的参数,那应该将外面这个参数的地址传递给函数。

4.NSString字符串的导出

#pragma mark 字符串的导出
void stringExport() {
NSString *str = @"123456我是字符串!!!!";
// 如果文件不存在,会自动创建文件
// 如果文件夹不存在,会直接报错
NSString *path = @"/Users/apple/Desktop/abc.txt"; NSError *error;
// 编码指定错误也会报错
// YES代表要进行原子性操作,也就是会创建一个中间的临时文件
[str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (error) {
// [error localizedDescription]会返回主要的错误信息
NSLog(@"写入失败:%@", [error localizedDescription]);
} else {
NSLog(@"写入成功");
}
}

原子性与非原子性的区别:

  若写入文件为原子性操作,则在写入内容之前会创建一个临时文件,先将内容写入临时文件,待内容完好无损地写入临时文件后,再将临时文件里的内容移到目标文件中,中途如果出错,临时文件出问题,不会影响到目标文件;非原子性操作直接将内容写入目标文件,一旦中途出错,可能造成目标文件里只有部分内容传入的情况。

5.NSString的常用方法

 #pragma mark 字符串的大小写处理
void caseTest() {
NSString *str = @"GuangDong";
// 转成大写
NSLog(@"大写:%@", [str uppercaseString]);
// 转成小写
NSLog(@"小写:%@", [str lowercaseString]);
// 首字母变大写,其他字母变小写
NSLog(@"首字母变大写:%@", [@"aGE" capitalizedString]);
} #pragma mark 字符串的比较
void compare() {
// 检测字符串的内容是否相同
BOOL result = [@"abc" isEqualToString:@"abc"];
NSLog(@"%i", result); // NSOrderedAscending 右边的字符串比左边大
// NSOrderedSame 两个字符串的内容相同
// NSOrderedDescending 左边的字符串比右边的大
NSComparisonResult result2 = [@"abc" compare:@"Abc"];
if (result2 == NSOrderedSame) {
NSLog(@"两个字符串的内容相同");
} else if (result2 == NSOrderedAscending) {
NSLog(@"右边 > 左边");
} else if (result2 == NSOrderedDescending) {
NSLog(@"右边 < 左边");
}
} #pragma mark 字符串的搜索
void search() {
NSString *str = @"123456456.txt"; NSLog(@"是否以22开头:%i", [str hasPrefix:@""]);
NSLog(@"是否以txt结尾:%i", [str hasSuffix:@"txt"]); // 搜索字符串
NSRange range = [str rangeOfString:@""];
// range.length == 0
if (range.location == NSNotFound) {
NSLog(@"不能找到");
} else {
NSLog(@"找到的范围是:%@", NSStringFromRange(range));
} // 从尾部开始搜索字符串
range = [str rangeOfString:@"" options:NSBackwardsSearch];
NSLog(@"%@", NSStringFromRange(range)); // 指定范围进行搜索
// [str rangeOfString:@"456" options:NSBackwardsSearch range:<#(NSRange)#>];
} #pragma mark 字符串的截取
void subString() {
NSString *str = @""; // 从索引3开始截取到尾部(包括3)
NSLog(@"%@", [str substringFromIndex:]); // 从头部开始截取到索引3之前(不包括3)
NSLog(@"%@", [str substringToIndex:]); // 指定范围进行截取
NSRange range = NSMakeRange(, );
NSLog(@"%@", [str substringWithRange:range]); NSString *str2 = @"a-b-c-d-5";
NSArray *array = [str2 componentsSeparatedByString:@"-"];
NSLog(@"%@", array); NSString *str3 = [array objectAtIndex:];
NSLog(@"%@", str3);
} #pragma mark 与路径相关
void pathTest() {
// 快速创建一个自动释放的数组
NSMutableArray *components = [NSMutableArray array];
[components addObject:@"Users"];
[components addObject:@"MJ"];
[components addObject:@"Desktop"];
// 将数组中的所有字符串拼接成一个路径
NSString *path = [NSString pathWithComponents:components];
NSLog(@"%@", path); // 将路径分解成一个数组
NSArray *cmps = [path pathComponents];
NSLog(@"%@", cmps); // path是一个字符串常量,是不可变的
path = @"/users/mj/test";
// 判断是够为绝对路径(依据是前面有无/)
NSLog(@"%i", [path isAbsolutePath]);
NSLog(@"最后一个目录:%@", [path lastPathComponent]);
// 删除最后一个目录
NSLog(@"%@", [path stringByDeletingLastPathComponent]);
// 在最后面拼接一个目录
NSLog(@"%@", [path stringByAppendingPathComponent:@"abc"]);
} #pragma mark 拓展名处理
void extension() {
NSString *str = @"/User/MJ/test.txt"; NSLog(@"拓展名:%@", [str pathExtension]);
// 删除拓展名
NSLog(@"%@", [str stringByDeletingPathExtension]);
// 添加拓展名
NSLog(@"%@", [@"abc" stringByAppendingPathExtension:@"mp3"]);
} #pragma mark 其他用法
void other() {
NSString *str = @"";
int a = [str intValue];
NSLog(@"%i", a); // 计算字数,不是计算字符数
NSLog(@"length=%zi", [@"我是字符串123" length]); // 取出对应的字符
unichar c = [@"abc" characterAtIndex:];
NSLog(@"%c", c); // 返回C语言中的字符串
const char *s = [@"abc" UTF8String];
NSLog(@"%s", s);
}

Objective-C:Foundation框架-常用类-NSString全解的更多相关文章

  1. Objective-C:Foundation框架-常用类-NSObject

    NSObject是所有类的基类,其常见用法有: #import <Foundation/Foundation.h> @interface Person : NSObject - (void ...

  2. Objective-C:Foundation框架-常用类-NSDictionary

    与NSString.NSArray一样,NSDictionary是不可变的,其对应可变类型为NSMutableDictionary.其用法如下: #import <Foundation/Foun ...

  3. Objective-C:Foundation框架-常用类-NSDate

    直接上代码吧: #import <Foundation/Foundation.h> #pragma mark 日期创建 void dateCreate() { // date方法返回的就是 ...

  4. Objective-C:Foundation框架-常用类-NSMutableDictionary

    直接上代码吧: #import <Foundation/Foundation.h> @interface Student : NSObject @property (nonatomic, ...

  5. Objective-C:Foundation框架-常用类-NSArray

    NSArray是用来存储对象的有序列表(NSSet是没有顺序的),它是不可变的.NSArray不能存储C语言中的基本数据类型,如int\float\enum\struct等,也不能存储nil.其用法如 ...

  6. Objective-C:Foundation框架-常用类-NSNull

    集合中是不能存储nil值的,因为nil在集合中有特殊含义,但有时确实需要存储一个表示“什么都没有”的值,那么可以使用NSNull,它也是NSObject的一个子类. #import <Found ...

  7. Objective-C:Foundation框架-常用类-NSNumber

    NSArray.NSDictionary是不可以存储C语言中的基本数据类型的.NSNumber可以将基本数据类型包装成对象,这样可以间接将基本数据类型存进NSArray.NSDictionary等集合 ...

  8. Objective-C:Foundation框架-常用类-NSMutableArray

    NSMutableArray是NSArray对的子类,它是可变的,可以随意添加或者删除元素.与Array,也有静态和动态两种创建方法.也可已使用NSArray的方法来创建NSMutableArray. ...

  9. Objective-C:Foundation框架-常用类-NSMutableString

    NSString是不可变的,不能删除字符或修改字符,它有一个子类NSMutableString,为可变字符串. NSMutableString的两种创建方法: - (id) initWithCapac ...

随机推荐

  1. [SAP ABAP开发技术总结]结构复用(INCLUDE)

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. Linux 下常用解压命令(转载)

    Linux下常用文件解压(包括rpm.deb包) Linux下怎么解后缀名是gzip的文件?1.以.a为扩展名的文件:#tar xv file.a2.以.z为扩展名的文件:#uncompress fi ...

  3. Redis 在新浪微博中的应用

    Redis 在新浪微博中的应用 Redis简介 1. 支持5种数据结构 支持strings, hashes, lists, sets, sorted setsstring是很好的存储方式,用来做计数存 ...

  4. clang: error: linker command failed with exit code 1 (use -v to see invocation)

    报错提示: ... ld: 6 duplicate symbols for architecture x86_64 clang: error: linker command failed with e ...

  5. 关于Android 构建

    在简书上面有系列关于Android 的文章,还不错,部分同学可以在开发过程中阅读和学习:www.jianshu.com/collection/3fde3b545a35 关于Android 构建,看到这 ...

  6. hdu2037-----------贪心, 活动安排问题

    http://acm.hdu.edu.cn/showproblem.php?pid=2037(简单贪心-----活动安排) #include<iostream> #include<a ...

  7. PL/SQL 听课笔记

    PL/SQL: 知识回顾: SQL:  结构化查询语言: T-SQL:  microsoft sql语言: PL/SQL: Oracle sql语言: 变量命名规则: 1.首字母必须是字母,可以包含字 ...

  8. iOS - UISplitViewController

    前言 NS_CLASS_AVAILABLE_IOS(3_2) @interface UISplitViewController : UIViewController @available(iOS 3. ...

  9. Nginx 的RTMP打流模块配置

    config配置文件: user www www; worker_processes ; error_log logs/error.log debug; #pid logs/nginx.pid; ev ...

  10. mysql概要(十五)存储过程

    1.定义: 2.查看所有存储过程: show procedure status; 3.创建存储过程: create procedure 存储过程名字(参数) begin s1l语句; end$     ...