NSString字符串操作及个人分析
可能理解有误,仅作个人学习记录
//
// main.m
// NSString字符串操作
//
// Created by yufeng on 15/5/14.
// Copyright (c) 2015年 kingsley. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString * GetStringTest(){
//这里是一个测试获取字符串的函数
//====================
//问题:
//一个方法中的NSString在alloc后需要return出去,此时该如何release它
NSString* string = [[NSString alloc] init];
string = @"12345";
//====================
//其他字符串初始方法:
//initWithUTF8String:初始化,用UTF8格式String
//NSString * str1 = [[NSString alloc] initWithUTF8String:"ARQWRT"];
//[str1 release];//ARC接管内存管理
//initWithFormat:用给定字符串初始化
//NSString * str2 = [[NSString alloc] initWithFormat:@"QRQWTQT"];
//[str2 release];//ARC接管内存管理
//stringWithFormat:便利构造器
//NSString * str3 = [NSString stringWithFormat:@"qqqqqq"];
//[str3 release];//ARC接管内存管理
//====================
//如果在不启用ARC的话,使用下面代码返回:
//return [string autorelease];
//编程过程中出错:’autorelease’ is unavailable: not available in automatic reference counting mode, ARC forbids explicit message send of ‘autorelease’
//其实错误很明显,就是说,autorelease不能使用。
//原因:创建当前iOS程序的时候,选择了“Use Automatic Reference Counting”,即使用了ARC,自动引用计数。
//所以此处,在写代码的时候,就不允许你再手动添加autorelease这个关键字了。
//对应的,编译器会帮你自己优化生成对应的释放内存的操作。
//所以,解决办法很简单,那就是直接删除autorelease这个关键字,直接返回string即可。
return string;
//====================
//总结:
//在创建iOS项目时,如果选择了"Use Automatic Reference Counting",那么代码中,自然就不需要再写autorelease了。
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
//NSString类中提供了这样三个方法用于获取子字符串:
//– substringFromIndex:
//– substringWithRange:
//– substringToIndex:
//它们该怎么使用呢?见下面代码即可知道。
NSString *str = GetStringTest();//@"12345";
//截取N位文本之后的内容
//NSString *subString0 = [str substringFromIndex:-1]; //会放生越界错误
NSString *subString1 = [str substringFromIndex:0]; //@"12345"
NSString *subString2 = [str substringFromIndex:1]; //@"2345"
NSString *subString3 = [str substringFromIndex:4]; //@"5"
NSString *subString4 = [str substringFromIndex:5]; //@""
// NSString *subString5 = [str substringFromIndex:6]; //会放生越界错误
//截取文本左边N位
//NSString *subString10 = [str substringToIndex:-1]; //会放生越界错误
NSString *subString11 = [str substringToIndex:0]; //@"“
NSString *subString12 = [str substringToIndex:1]; //@"1”
NSString *subString13 = [str substringToIndex:4]; //@"1234“
NSString *subString14 = [str substringToIndex:5]; //@"12345”
//NSString *subString15 = [str substringToIndex:6]; //会放生越界错误
//截取范围定义,其中location是从0开始的
NSRange range1 = NSMakeRange(-1, 5); //越界 //没有用到会提示警告:Unused varlable '变量',可以忽略
NSRange range2 = NSMakeRange(0, 6); //越界 //没有用到会提示警告:Unused varlable '变量',可以忽略
NSRange range3 = NSMakeRange(0, 5); //从第0位开始,截取5个字符
NSRange range4 = NSMakeRange(1, 4); //从第1位开始,截取4个字符
NSRange range5 = NSMakeRange(0, 0); //从第0位开始,截取0个字符,这是可以的
NSRange range6 = NSMakeRange(4, 1); //从第4位开始,截取1个字符
//====================
//NSMakeRange函数解析
//----------
//NSRange NSMakeRange (
// NSUInteger loc,
// NSUInteger len
// );
//----------
//这是官方得接口描述。loc 为location缩写,len 表示长度。作用:在loc指定得位置开始往后获取len长度个得元素。
//示例程序使用这个函数来为指定数组得某个位置向后指定长度得元素集合。如NSRange NSMakeRange(0,1)表示在获取数组得0和1两个元素得集合。
//相关函数:
//NSUInteger NSMaxRange ( NSRange range );
//作用:返回 range 的 loc + len 的值
//====================
//NSRange(范围)的定义
//----------
//typedef struct _NSRange
//{
// NSUInteger location;
// NSUInteger length;
//} NSRange;
//----------
//NSRange是一个结构体,其中location是一个以0为开始的index,length是表示对象的长度。他们都是NSUInteger类型。
//====================
//NSUInteger类型的定义如下:
//#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
// typedef unsigned long NSUInteger;
//#else
// typedef unsigned int NSUInteger;
//#endif
//截取指定范围的文本内容
//NSString *subString31 = [str substringWithRange:range1]; //会放生越界错误
//NSString *subString32 = [str substringWithRange:range2]; //会放生越界错误
NSString *subString33 = [str substringWithRange:range3]; //@"12345“
NSString *subString34 = [str substringWithRange:range4]; //@"2345”
NSString *subString35 = [str substringWithRange:range5]; //@"”
NSString *subString36 = [str substringWithRange:range6]; //@"5"
//输出操作结果
NSLog(@"%@",subString1);//直接NSLog(subString1)会有警告,IDE会认为这不是一个字符串,所以用这种格式化字符串的方式来输出
NSLog(@"%@",subString2);
NSLog(@"%@",subString3);
NSLog(@"%@",subString4);
NSLog(@"%@",subString11);
NSLog(@"%@",subString12);
NSLog(@"%@",subString13);
NSLog(@"%@",subString14);
NSLog(@"%@",subString33);
NSLog(@"%@",subString34);
NSLog(@"%@",subString35);
NSLog(@"%@",subString36);
NSLog(@"%d",(int)[subString33 length]);//取得文本长度:5
NSLog(@"Range is: %@", NSStringFromRange(range2));//输出range//@"Range is: {0, 6}"
//====================
//NSStringFromRange()方法,将一个NSRange返回一个NSString。
//而另外一个函数NSRangeFromString()则是将NSString转换为NSRange
//angeOfString:字符串范围
NSRange range7 = [subString33 rangeOfString:@"234"];//查找@"12345"中,"234"所在的范围
NSLog(@"location = %ld,lenth = %ld",range7.location,range7.length);//location = 1,lenth = 3
//====================
//hasSuffix:判断字符串是否以指定字符串结束
if ([subString33 hasSuffix:@"abc"]) {
NSLog(@"yes");
}else{
NSLog(@"no");
}
}
return 0;
}