我今天遇到的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语句往往需要多行显示来提高可读性、较长的文本的段落之间需要分行显示以便更容易找到分段位置。

转载于:https://www.cnblogs.com/baozou/p/3262934.html

ios开发中遇到的文件和字符的问题大总结相关推荐

  1. iOS开发中plist文件的创建与简单读取(一)

    iOS开发中plist文件的创建与简单读取(一) 1. 创建一个工程 2. 新建一个plist文件(command+N快捷键或者新建文件 如图下的红色圈) 3. 红色圈是plist的文件名,这里默认为 ...

  2. iOS开发中常用的方法

    iOS开发中常用的方法 系统弹窗: 过期方法: UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"确认报价" ...

  3. iOS开发中遇到的一些问题及解决方案【转载】

    iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // //  MyScrollView.m //  Creat ...

  4. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  5. iOS 开发中的多线程

    线程.进程 什么是线程.进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载 ...

  6. [UWP]在应用开发中安全使用文件资源

    原文:[UWP]在应用开发中安全使用文件资源 在WPF或者UWP应用开发中,有时候会不可避免的需要操作文件系统(创建文件/目录),这时候有几个坑是需要大家注意下的. 创建文件或目录时的非法字符检测 在 ...

  7. iOS开发UI篇—iOS开发中三种简单的动画设置

    [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要"参与到"动画中 [UIView beginAnimations: ...

  8. 浅谈iOS 开发中的界面通信

    在任何的软件开发中都离不开界面与界面之间的通信,界面通信的最直接的方法就是界面传值. 在开发过程中我们在页面传值时我们通常使用的方法有:属性传值法,block传值法,代理传值法,以及单例传值法,通知传 ...

  9. iOS开发中打电话发短信等功能的实现

    在APP开发中,可能会涉及到打电话.发短信.发邮件等功能.比如说,通常一个产品的"关于"页面,会有开发者的联系方式,理想情况下,当用户点击该电话号码时,能够自动的帮用户拨出去,就涉 ...

最新文章

  1. LeetCode 93. Restore IP Addresses--面试算法题--Python解法
  2. ext form验证tip_FormValidator表单验证
  3. 弹簧压缩 时间 matlab,用matlab解决弹簧振子摆动与时间的关系
  4. linkedblockingqueue使用_阿里规范要求不能使用Executors创建线程
  5. 洛谷P1085不高兴的津津
  6. 【剑指offer】面试题24:反转链表(Java 实现)
  7. freemarker判断是否为空
  8. 常用选择器(CSS+JQuery)
  9. C#中RestoreDirectory属性
  10. wps表格的宏被禁用问题
  11. 净化-湿式除尘器:湿式除尘器
  12. 阴阳师服务器维护内容,阴阳师8月1日维护内容介绍_友人帐弈鬼切内容介绍_3DM手游...
  13. CDH Parcel包starrocks集成cloudera Manager
  14. 正则表达式有多强大一看便知!
  15. PDF如何转换成EPUB格式
  16. 阿里P8架构师首推Netty实战,实战篇+面试篇,将知识点一网打尽
  17. 不一样的技术人工作、面试指南
  18. 张士峰:经验分享之我的科研历程
  19. (附源码)springboot高校学生健康打卡系统的设计与实现 毕业设计 021009
  20. C/C++中strstr()函数:返回字符串中首次出现子串的地址

热门文章

  1. 字节跳动又一款中重度游戏曝光,它要进军“漫改MMO”领域!
  2. 如何解决游戏延迟,增强用户体验? 几种可行方案分享
  3. 《轩辕传奇手游》主程序带你拆解MMORPG游戏客户端
  4. pyecharts第九节、旭日图(现代饼图)
  5. kill -HUP 什么意思?
  6. 【drp 12】再识转发和重定向:SpringMVC无法跳转页面
  7. Mantis安装过程笔记
  8. 使用Android应用调用WebService实现天气预报
  9. c语言程序链接过程,C语言简明教程(二):C程序编译链接过程和实例对照详解...
  10. matlab 回音的消除,回声消除AEC - 源码下载|数值算法/人工智能|matlab例程|源代码 - 源码中国...