ios开发中遇到的文件和字符的问题大总结
我今天遇到的NSString問題
今天遇到一個字符串空指針問題,讓我明白了許多
其實我們定義一個NSString * string,其實是定義了一個字符串指針,現(xiàn)在string沒有指向任何地方,我們必須把它初始化string=[[NSString alloc]init],現(xiàn)在它才指向它的新分配的內(nèi)存。但是今天一時迷糊,犯了個錯誤,我把一個字符串變量還有一個@""生成的字符串常量賦值給了string字符指針,這樣就造成了我[[NSString alloc]init]新生成的一塊內(nèi)存就沒有使用就泄露了,另一方面因為string指的是一個局部字符串變量,過了函數(shù)的生存期它就自動釋放了,在其他的地方我又使用它,所以我的程序遇到了空指針,導致程序錯誤。
正確的做法就應(yīng)該是使用自動生成的set和get方法。即
@property (nonatomic, retain)? ? NSString *string; 另外不能忘記@synthesize?string;我前幾天就吃過這個苦頭,沒有這個synthesize我通過.運算符得到的就是一個空值。然后我們在自己的類中使用self.string來得到
下面再來說一下assign,copy,retain的區(qū)別:
assign就不用說了,因為基本上是為簡單數(shù)據(jù)類型準備的,而不是NS對象們,另外delegate一定要使用assign。?
Retain vs. Copy:
copy: 建立一個索引計數(shù)為1的對象,然后釋放舊對象?
retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數(shù)為1?
那上面的是什么該死的意思呢??
Copy其實是建立了一個相同的對象,而retain不是:?
比如一個NSString對象,地址為0×1111,內(nèi)容為@”STR”?
Copy到另外一個NSString之后,地址為0×2222,內(nèi)容相同,新的對象retain為1,舊有對象沒有變化?
retain到另外一個NSString之后,地址相同(建立一個指針,指針拷貝),內(nèi)容當然相同,這個對象的retain值+1?
也就是說,retain是指針拷貝,copy是內(nèi)容拷貝。哇,比想象的簡單多了…?
------------------------------2013.09.07再次更新--------------------------------------------
昨天又遇到空指針的問題了,我又仔細看了我的這篇文章,照著檢查了一番,沒有錯誤啊,最后還是學淵哥告訴我,用的時候應(yīng)該用self.string=,而不是直接用string=,前者調(diào)用的是set方法,后面還是相當于把指針指向別的地方了。過幾天再看我所遇到的這些問題,好幼稚啊,其實這些都是初學者經(jīng)常犯的錯誤。今天又仔細的看了一下子龍山人的博客:http://www.cnblogs.com/zilongshanren/tag/objective-c/ ? 真是大徹大悟啊~~媽媽再也不用擔心我的學習了。
iOS 刪除文件夾下所有文件的方式
有時候需要在iOS系統(tǒng)里面,刪除指定文件夾的內(nèi)容,文件夾里面可能是文件,也可能包含有文件夾。
刪除指定類型的文件。方法如下:
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,里面對應(yīng)的是文件夾里面的內(nèi)容,可以使用NSLog()打印輸出
然后通過NSEnumerator枚舉出來。判斷擴展名是否為m4r,如果是,則刪除。
?
中文轉(zhuǎn)換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];
????
//結(jié)果都是:str1str2
?一般推薦使用方法1,如果需要大量字符串連接推薦使用方法4,需要更少的內(nèi)存開銷。
?
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);
//結(jié)果都是:SELECT?[CustomerID],?[CustomerName]?FROM?[Customer]?WHERE?[CustomerID]?=?1234
注意字符串中每行結(jié)尾處的空格。這種字符串聲明方式雖然看上去是多行,實際上字符串中并沒有換行符,也就是說整個字符串實際上是一行。如果需要在字符串中換行,可以在字符串中加入換行符"\n"。這種聲明方式一般用在需要在代碼中多行顯示字符串以便提高可讀性,例如:SQL語句往往需要多行顯示來提高可讀性、較長的文本的段落之間需要分行顯示以便更容易找到分段位置。
轉(zhuǎn)載于:https://www.cnblogs.com/baozou/p/3262934.html
總結(jié)
以上是生活随笔為你收集整理的ios开发中遇到的文件和字符的问题大总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET错误:未找到类型或命名空间名称
- 下一篇: 从生活角度学习应用程序、虚拟目录、应用程