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开发技术总结]权限对象检查

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

  2. CUBRID学习笔记 34 net参数化查询 cubrid教程示例

    using CUBRID.Data.CUBRIDClient; namespace ParameterExample { class Program { static void Main(string ...

  3. FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术)

    FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术) Time Limit: 1000MS   Memory Limit: 257792K [Description ...

  4. 序列的方法(str,list,tuple)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在快速教程中,我们了解了最基本的序列(sequence).回忆一下,序列包含有定值 ...

  5. lazyload懒加载的使用

    1.引用<script src="http://a.tbcdn.cn/apps/baron/js/??lib/tmm/tmm.js,lib/lazyload/lazyload.js?2 ...

  6. max(min)-device-width和max(min)-width的区别

    在网页自适应设计中,max-device-width和max-width是不可缺少的两大CSS属性,但是可能大家在使用的选择上没有太多讲究,认为用其中一个即可.确实,如果没有特定要求,用任何一个都没有 ...

  7. Linux下C程序的编译,运行,及调试

    先查看linux有没有gcc 和 gdb $ gcc -v $ gdb -v 如果没有安装gcc,可以 $ yum install gcc 要获取管理员权限才能安装软件,$ su root (有的li ...

  8. (一)解决Sublime Text 2中文显示乱码问题

    欲解决问题,关键在于让Sublime Text 2支持GB2312和GBK.步骤如下: 1.安装Sublime Package Control.   在Sublime Text 2上用Ctrl+-打开 ...

  9. 5.6 a、b交换

    答案:int max = ((a+b)+abs(a-b))/2;

  10. Java集合类源码分析

    常用类及源码分析 集合类 原理分析 Collection   List   Vector 扩充容量的方法 ensureCapacityHelper很多方法都加入了synchronized同步语句,来保 ...