1.OC字符串
C语言中,字符和字符串都为常量。
OC中仍然可以使用C的字符串和字符,但其有专有的字符类,可以声明专有的字符串对象。OC的字符串,结尾不考虑尾0,查字符串位置时,起始为0,这和数组有一些类似,这里一定要记清楚,因为一些字符串操作函数,字符的位置非常重要。
2.NSString OC特有字符串的声明
NSString *str1=@”Hello World”;
与C的区别,字符串前面加@,告诉编译器,在只读数据段创建一个字符串对象,将字符串对象的地址付给指str1。
NSString *str2=[[NSString alloc]initWithString:@”Hello World”];
或者@位置,直接写字符串地址。
打印输出使用%@,如NSLog(“%@”,str2);
NSString * str3=[NSString StringWithString:@”Hello World”];       
这三种方式均可以创建,OC的字符串,但是第二种方式使用了alloc,为了符合内存管理的黄金法则,我们必须在使用完str2后,[str2 release]一下。
3.字符串与其他类型对象的内存管理有所区别
 NSString * str=@”Hello World”;
Str位于只读数据段,无法修改,程序开始时就存在了,在main压栈前就存在,程序结束时消失。不用理会它的内存管理。
NSString *str=[[NSString alloc]initWithString:@”Hello world”];
即使这样创建对象,字符串仍在只读数据段中,不存在于堆里,这就是OC字符串对象的独特之处。数据段里的字符串对象,显然不能进行内存管理,但是为了维护黄金法则,对应alloc,仍然进行release,但是alloc不会使字符串对象的计数器+1,release也不会使其-1,完全是一种假象。
4.OC字符串存在于堆中的特例
NSString *str = [[NSString alloc]initWithUTF8String:”Hello World”];
这是一个存在于堆中的特例,这个OC字符串是使用C的字符串创建的。这种方法,对象在堆里,真的需要release。换句话说,使用alloc创建字符串对象,可能在堆里,可能在只读数据段。为了防止混乱,我们一律遵循黄金法则。见到alloc,都加上release。
只要始终按照黄金法则编写,程序就不会出错。这里有个易犯的错误:
const char * p = str2.UTF8String;
这里是OC字符串转为C字符串,这里的str2不是对象,不能retain。这里实际上是一个get函数。
5.格式化创建字符串
NSString * str = [[NSString alloc]initWithFormat:@””Hello %d world %c , 45,’@’];
这种格式化创建的字符串,打印出str后,为“Hello 45 world @”。这种方式创建字符串有很大的作用,比如拼接多个字符串到一个字符串中。这种用法在C语言中,很难实现。比如:
NSString * str1 = [[NSString alloc]initWithFormat:@”%@%@%@”,@”I am”,@”a good”,@”boy”];
这样就把三个OC字符串,拼接在了一起。
6.字符串创建的stringwith版本
所有的alloc init版本的字符串声明,都对应着一个StringWith版本。以上的几个声明可写为:
NSString *str = [NSString StringWithUTF8String:”Hello World”];
NSString * str = [NSString StringWithFormat:@””Hello %d world %c , 45,’@’];
这里的声明没有用到alloc所以,不用考虑内存管理。
7.描述函数
+(NSString *)description;//描述该类
-(NSString *)description;//描述具体对象
以Dog* dog为例,函数写法一般为:
           +(NSString *)description
           {
                return [NSString stringWithString:@"This ia Dog!"];
           }
           -(NSString *)description
           {
                return [NSString stringWithString:@”This is a dog!”];
           }
调用类的描述:“NSLog(@”%@”,[Dog description]);”
调用的时候很简单,譬如调用对象的描述:“NSLog(@”%@”,dog);”这里相当于调用[dog description]。但是这种描述有一种缺点,就是缺少对具体对象的描述,因此我们将其改写为:
           -(NSString *)description

           {
               return [NSString stringWithFormat:@”This is a dog named %@!”,name];
           }
这里的name,具体是每一个对象的name,每一个对象有一个name。
8.字符串比较
C语言中字符串的操作比较复杂,但是在OC中字符串的操作简单了很多.OC中比较字符串,依赖于OC的BOOL类型(YES&&NO)。
BOOL ret=[str1 isEqualToString:str2];
//比较两个字符串,一个作为调用函数的对象,一个作为函数的参数,相等返回YES,不相等返回NO。
NSUInteger ret=[str1 compare:str2];
//左边大,返回正数;右边大,返回负数;相等,返回零。
9.字符串查找
在一段字符串里查找子串。
[str1 rangOfstring : str2];//返回类型为NSRange
查找str2在str1中的位置,NSRange是一结构体,包含两个参数location和length。以ret为例:
NSRange ret={3,4};
ret.location==3; //表示起点位置
ret.length==4;       //表示长度
若没有查找到子串,返回值为NSNotFound。这个数为NSRange类型,具体值不是0,这里我们不必考虑了。
10. 提取字符串
给定一个范围,将字符串取出。以字符串str为例,几种提取函数如下:
NSString * str = @”I was not so bad!”;
NSString * str1=[str SubStringToIndex:6];
//从str起始位置,取六个,0~5不包括6,赋给str1.
NSString * str2 = [str SubStringFromIndex:6];
//从str为6的位置,开始取包括6,取到最后赋给str2.
NSString * str3 = [str SubStringWithRange:NSMakeRange(3,4)];
//从第三个开始取,取长度为4个字节,赋给str3。NSMake是又调用的一个函数,返回一个NSRange类型的结构体。
11. 字符串长度
与C语言中的strlen不同,OC中取长度非常简单,以str=@"hello"为例,str.length可直接通过get函数获得长度。这里值为5,文章开头说过OC中 字符串不考虑尾0。
12. 取字符串中的字符
NSLog(@"%c",[str characterAtIndex:4]);//这里的意思就是打印字符串str的第四个字符。