我今天遇到的NSString问题

今天遇到一个字符串空指针问题,让我明白了许多

其实我们定义一个NSString * string,其实是定义了一个字符串指针,现在string没有指向任何地方,我们必须把它初始化string=[[NSString alloc]init],现在它才指向它的新分配的内存。但是今天一时迷糊,犯了个错误,我把一个字符串变量还有一个@""生成的字符串常量赋值给了string字符指针,这样就造成了我[[NSString alloc]init]新生成的一块内存就没有使用就泄露了,另一方面因为string指的是一个局部字符串变量,过了函数的生存期它就自动释放了,在其他的地方我又使用它,所以我的程序遇到了空指针,导致程序错误。

正确的做法就应该是使用自动生成的set和get方法。即

@property (nonatomic, retain)    NSString *string; 另外不能忘记@synthesize string;我前几天就吃过这个苦头,没有这个synthesize我通过.运算符得到的就是一个空值。然后我们在自己的类中使用self.string来得到

下面再来说一下assign,copy,retain的区别:

assign就不用说了,因为基本上是为简单数据类型准备的,而不是NS对象们,另外delegate一定要使用assign。 
Retain vs. Copy:
copy: 建立一个索引计数为1的对象,然后释放旧对象 
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 
那上面的是什么该死的意思呢? 
Copy其实是建立了一个相同的对象,而retain不是: 
比如一个NSString对象,地址为0×1111,内容为@”STR” 
Copy到另外一个NSString之后,地址为0×2222,内容相同,新的对象retain为1,旧有对象没有变化 
retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1 
也就是说,retain是指针拷贝,copy是内容拷贝。哇,比想象的简单多了…

------------------------------2013.09.07再次更新--------------------------------------------

昨天又遇到空指针的问题了,我又仔细看了我的这篇文章,照着检查了一番,没有错误啊,最后还是学渊哥告诉我,用的时候应该用self.string=,而不是直接用string=,前者调用的是set方法,后面还是相当于把指针指向别的地方了。过几天再看我所遇到的这些问题,好幼稚啊,其实这些都是初学者经常犯的错误。今天又仔细的看了一下子龙山人的博客:http://www.cnblogs.com/zilongshanren/tag/objective-c/   真是大彻大悟啊~~妈妈再也不用担心我的学习了。

iOS 删除文件夹下所有文件的方式

有时候需要在iOS系统里面,删除指定文件夹的内容,文件夹里面可能是文件,也可能包含有文件夹。

删除指定类型的文件。方法如下:

NSString *extension = @"m4r";
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; NSArray *contents = [fileManager contentsOfDirectoryAtPath:documentsDirectory error:NULL];
NSEnumerator *e = [contents objectEnumerator];
NSString *filename;
while ((filename = [e nextObject])) { if ([[filename pathExtension] isEqualToString:extension]) { [fileManager removeItemAtPath:[documentsDirectory stringByAppendingPathComponent:filename] error:NULL];
}
}

删除sandbox 里面的Documents目录里面的文件夹

NSArray *contents,里面对应的是文件夹里面的内容,可以使用NSLog()打印输出

然后通过NSEnumerator枚举出来。判断扩展名是否为m4r,如果是,则删除。

中文转换NSSTRING

NSString *urlString=[@"http://www.google.com/search?client=safari&rls=en&q=搜索&ie=UTF-8&oe=UTF-8" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *url=[NSURL URLWithString:urlString];

NSString *s=[[url absoluteString] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSLog(@”%@”,s);

NSString常用代码

1.判断字符串是否为空

if ([text lenght] == 0) {
    // empty string
}

2.字符串连接

 
NSString *str1 = @"str1";
NSString *str2 = @"str2";
NSString *result;

//方法1
result = [str1 stringByAppendingString:str2];
NSLog(result, nil);

//方法2
result = [NSString stringWithFormat:@"%@%@", str1, str2];
NSLog(result, nil);

//方法3
result = [@"" stringByAppendingFormat:@"%@%@", str1, str2];
NSLog(result, nil);

//方法4
NSMutableString *ms = [[NSMutableString alloc] init];
[ms appendString:str1];
[ms appendString:str2];
NSLog(ms, nil);
[ms release];
    
//结果都是:str1str2

 

一般推荐使用方法1,如果需要大量字符串连接推荐使用方法4,需要更少的内存开销。

3.去除字符串首尾的空格和换行符

NSString *text = [textView.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

4.多行书写字符串常量

 
NSString *str1 = @"SELECT [CustomerID], [CustomerName] "
"FROM [Customer] "
"WHERE [CustomerID] = 1234";

NSString *str2 = @"SELECT [CustomerID], [CustomerName] \
FROM [Customer] \
WHERE [CustomerID] = 1234";

NSLog(str1, nil);
NSLog(str2, nil);

//结果都是:SELECT [CustomerID], [CustomerName] FROM [Customer] WHERE [CustomerID] = 1234

 

注意字符串中每行结尾处的空格。这种字符串声明方式虽然看上去是多行,实际上字符串中并没有换行符,也就是说整个字符串实际上是一行。如果需要在字符串中换行,可以在字符串中加入换行符"\n"。这种声明方式一般用在需要在代码中多行显示字符串以便提高可读性,例如:SQL语句往往需要多行显示来提高可读性、较长的文本的段落之间需要分行显示以便更容易找到分段位置。

ios开发中遇到的文件和字符的问题大总结的更多相关文章

  1. 关于iOS开发中info.plist文件的解读

    我们建立一个工程后,会在Supporting files下面看到一个"工程名-Info.plist"的文件,这个是对工程做一些运行期配置的文件,很重要,不能删除.  下面就对其ke ...

  2. iOS 开发中有关pch文件,以及pch常用的内容

    一.创建pch文件.点击command+N.如下图操作 命名规则一般都是:项目名称-Prefix 第二步 OK,到这里已经把pch文件制作完毕.接下来就可以用了. pch文件一般书写的是全局都可以用到 ...

  3. 如何在IOS开发中在自己的framework中添加.bunble文件

    今天就跟大家介绍一下有关,如何在IOS开发中在自己的framework中添加.bunble文件,该文章我已经在IOS教程网(http://ios.662p.com)发布过来,个人觉得还是对大家有帮助的 ...

  4. iOS开发中使用静态库 .a 文件

    ​​iOS开发中,在使用一些第三方库时,可能是一个静态库(比如GPUImage).这种情况下,需要编译出静态库文件(.a) ,然后配合响应的头文件(.h 文件)使用. 编译静态库,直接在Xcode中编 ...

  5. iOS开发中文件的上传和下载功能的基本实现-备用

    感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...

  6. 实现多文件上传在iOS开发中

    该功能实现了实现多文件上传在iOS开发中,喜欢的朋友可以研究一下吧. NSURL* url = [NSURL URLWithString:@"xxx"]; ASIFormDataR ...

  7. iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (以后谁不会了,直接将连接给他)

    iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (一有冲突要手把手教一遍,太麻烦了,现在总结下,以后谁不会了,连接直接发他). 关于xxx.xcodeproj 文件冲突的话,是比较 ...

  8. ios开发中的小技巧

    在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...

  9. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

随机推荐

  1. (bzoj1337 || 洛谷P1742 最小圆覆盖 )|| (bzoj2823 || 洛谷P2533 [AHOI2012]信号塔)

    bzoj1337 洛谷P1742 用随机增量法.讲解:https://blog.csdn.net/jokerwyt/article/details/79221345 设点集A的最小覆盖圆为g(A) 可 ...

  2. Script to Monitor Current User Activity in the Database

    Execution Environment: SQL, SQL*Plus, iSQL*Plus Access Privileges: Requires select privileges on vie ...

  3. Windows如何利用输入法简单的打出 ‘↑’ ‘↓’ ‘↖’等箭头

    ‘↑’  shang ‘↓’ xia ‘←’ zuo ‘→’ you ‘↖’ zuoshang ‘↙’  zuoxia ‘↗’  youshang ‘↘’  youxia

  4. tera term超级终端

    一款Window上的虚拟终端工具,它同时支持串口连接和网络连接,而对于网络连接它支持Telnet和SSH协议.最关键的是Tera Term支持自己的脚本语言,即TTL(Tera Term Langua ...

  5. js 中对字符串的操作

    1.split() split() 方法用于把一个字符串分割成字符串数组. 用法:stringObject.split(separator,howmany) separator:必选,类型为字符串或者 ...

  6. File "<stdin>" , line 1

    写了一个hello.py,仅有一句,print 'hello world', 运行 Python hello.py 出错,提示: File "<stdin>" , li ...

  7. Linux 环境下安装 Nginx+php+mysql 开发环境

    一直以来都没有养成记录学习的好习惯,我想从这么一天开始,把自己学习和工作中的经验和坑都记录下来.等到以后老的时候还有可以回忆的地方. 最近在学习linux,虽然已经玩linux很久了,但是没有怎么用心 ...

  8. python部分 + 数据库 + 网络编程

    PS:附上我的博客地址,答案中略的部分我的博客都有,直接原标题搜索即可.https://www.cnblogs.com/Roc-Atlantis/ 第一部分 Python基础篇(80题) 为什么学习P ...

  9. 洛谷 P1330 封锁阳光大学

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  10. ubuntu 16.0 利用ant编译 hadoop-eclipse-plugins2.6.0

    折腾了两天,抱着不放弃的精神,我终于编译出我自己所需的hadoop中在eclipse中的插件 在网上下载的可能因为版本不一致,在编译的时候出现各种各样的问题,包括你的eclipse版本和hadoop版 ...