今天学习了NSString类的常用构造方法,更加深入理解了OC语言风格。
一般来说,OC的构造方法风格是这样的:
1. 通过类静态方法alloc分配内存,再调用以init打头的构造函数来初始化类实例对象。
2. 通过类静态方法直接实例化对象,其静态方法名字通常是类名首字母变小写(去掉前缀先~)。这种方式的内部实现当然是靠1完成,而且这种方法一般都自动释放。
慢慢开始喜欢上OC这个语言了,虽在严谨性上比不上Java,但是比Java轻巧很多。
//
// main.m
// NSString
//
// Created by zzqiltw on 14-5-26.
// Copyright (c) 2014年 zzqiltw. All rights reserved.
//
#import <Foundation/Foundation.h>
#pragma mark NSString的init创建
void createStringByInit() {
// 常量创建,不需要释放
NSString *str1 = @"Hello!";
// 其他:
NSString *str2 = [[NSString alloc] init];
str2 = @"Hello!";
NSString *str3 = [[NSString alloc] initWithString:str2];
// C风格字符串(const char*)转OC字符串:
//注意没有@
NSString *str4 = [[NSString alloc] initWithUTF8String:"Hello!"];
NSString *str5 = [[NSString alloc] initWithFormat:@"My name is %@", @"zzq" ];
NSLog(@"%@%@%@%@%@", str1, str2, str3, str4, str5);
}
#pragma mark NSString的静态方法创建
void createStringByStaticMethod() {
NSString *str1 = @"Hello!";
NSString *str3 = [NSString stringWithString:str1];
NSString *str4 = [NSString stringWithUTF8String:"Hello!"];
NSString *str5 = [NSString stringWithFormat:@"My name is %@", @"zzq" ];
NSLog(@"%@%@%@%@", str1, str3, str4, str5);
}
#pragma mark NSString读取文件内容
void createStringFromFile() {
NSString *filename = @"/Users/zzqiltw/Desktop/test.txt";
// 如果读取文件失败,在Java中会抛出异常
// 在OC中也可以用@try@catch@finally来捕获异常,但是这个例子里有更方便的做法是使用NSError
NSError *error;
// 将error作为参数传进去,如果有错误(如文件找不到)则会给error赋值,如果没有错误则error是nil。
// 想通过函数改变变量的值,必须把地址传进去
NSString *fileContent =
[NSString stringWithContentsOfFile:filename encoding:NSUTF8StringEncoding error:&error];
if (error == nil) {
NSLog(@"读取文件成功,内容为:\n%@", fileContent);
} else {
NSLog(@"读取文件失败,错误为:\n%@", [error localizedDescription]);
}
}
#pragma mark NSString打开URL
void createStringFromURL() {
// 本例中的error处理方法同上,这里不再重复
// 1. 用URL打开一个文件:
// 这里的fileURL开头有三个/,前两个和file://连在一起的,表示schema。第三个/是表示文件路径的一部分
NSURL *fileURL = [NSURL URLWithString:@"file:///Users/zzqiltw/Desktop/test.txt"];
NSString *fileContent = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", fileContent);
//2. 用URL打开一个网址:
NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
NSString *urlContent = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", urlContent);
}
#pragma mark NSString从一个文件中读入String再写入另外一个文件中
void writeString2File() {
NSString *fromFilename = @"/Users/zzqiltw/Desktop/test.txt";
// 输出文件如果不存在的话会自动创建,但是目录不存在就不会了,而且会报错。
NSString *toFilename = @"//Users/zzqiltw/Desktop/test2.txt";
NSString *content =
[NSString stringWithContentsOfFile:fromFilename encoding:NSUTF8StringEncoding error:nil];
/*
YES表示原子性。即
字符串先一点一点地写入一个临时文件中,等字符串全部写完了,再把临时文件剪切到目标文件中。
如果文件写入过程中出错了,则把临时文件删掉,而不写到目标文件中并且报错。(推荐使用)
*/
[content writeToFile:toFilename atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
// createStringByInit();
// createStringFromFile();
// createStringFromURL();
writeString2File();
}
return 0;
}