您的位置:首页 > 其它

<NSString>OC字符串

2012-12-10 19:27 176 查看
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的第四个字符。
本文出自 “CoderToDeveloper” 博客,请务必保留此出处http://rongchengfei.blog.51cto.com/6269699/1085003
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: