IOS开发之OC基础学习笔记(中) 原创
<p></p><div class="toc">
<h4>文章目录</h4>
<ul><li><ul><li><ul><li>1. Foundation-结构体</li><li>2. Foundation-NSString</li><li><ul><li>NSString的创建</li><li>从文件、网络读取文本</li><li>字符串的导出</li><li>大小写转换</li><li>字符串的比较</li><li>字符串的搜索</li><li>字符串的截取</li><li>与路径相关</li><li>拓展名处理</li><li>其他用法</li></ul>
</li><li>3. Foundation-NSMutableString</li><li><ul><li>可变字符串的创建</li></ul>
</li><li>4. Foundation-NSArray</li><li><ul><li>创建一个数组</li><li>数组的简单使用</li><li>数组的内存管理</li><li>给数组里面的元素发送消息</li><li>遍历数组</li><li>派生出新的数组</li><li>数组的其他用法</li><li>数组排序</li></ul>
</li><li>5. Foundation-NSMutableArray</li><li><ul><li>用法如下</li><li>NSMutableArray的内存管理</li></ul>
</li></ul>
</li></ul>
</li></ul>
</div>
<p></p>
<blockquote>
<ul><li>该笔记源自对传智播客《IOS开发快速入门视频》的学习</li><li>如有侵权,请联系本人删除。</li><li>都是比较基础的OC知识,中高级开发者可以忽略本文</li><li>很多重要内容在代码注释中</li></ul>
</blockquote>
<h4>1. Foundation-结构体</h4>
<p>用法参考:<br> <code>NSRange range = NSMakeRange(8, 10);</code><br> <code>CGPoint p = NSMakePoint(10, 9);</code><br> <code>NSPoint p = CGPointMake(8, 9);</code><br> <code>NSSize size = NSMakeSize(90, 80);</code><br> <code>CGSize size = CGSizeMake(10, 8);</code><br> <code>NSRect rect = = NSMakeRect(10, 10, 80, 80);</code><br> <code>CGRect rect = CGRectMake(8, 9, 10, 90);</code><br> 类型打印方式:NSLog(@"%@", NSStringFromRect(rect));</p>
<h4>2. Foundation-NSString</h4>
<h5>NSString的创建</h5>
<pre><code>// 这种方式创建出来的字符串是不需要释放的
NSString *str1 = @"A String!";
NSString *str2 = [ init];
str2 = @"A String!";
;
//将c语言的字符转NSString
NSString *str4 = [ initWithUTF8String:"A String!"];
;
str4 = ;
str5 = ;
</code></pre>
<h5>从文件、网络读取文本</h5>
<pre><code>NSString *path = @"/Users/apple/Desktop/test.txt";
// 这个方法已经过期,不能解析中文
// NSString *str1 = ;
// 定义一个NSError变量
NSError *error;
// 指定字符串编码为UTF-8: NSUTF8StringEncoding
NSString *str1 = ;
if (error == nil) { // 没有错误信息
NSLog(@"读取文件成功:%@", str1);
} else {
NSLog(@"读取文件失败:%@", error);
}
NSURL *url = ;
NSString *str2 = ;
NSLog(@"%@", str2);
NSURL *url2 = ;
NSString *str3 = ;
NSLog(@"%@", str3);
</code></pre>
<h5>字符串的导出</h5>
<pre><code>NSString *str = @"123456我是字符串!!!!";
// 如果文件不存在,会自动创建文件
// 如果文件夹不存在,会直接报错
NSString *path = @"/Users/apple/Desktop/abc.txt";
NSError *error;
// 编码指定错误也会报错
// YES代表要进行原子性操作,也就是会创建一个中间的临时文件
;
if (error) {
// 会返回主要的错误信息
NSLog(@"写入失败:%@", );//???
} else {
NSLog(@"写入成功");
}
</code></pre>
<h5>大小写转换</h5>
<pre><code>NSString *str = @"GuangDong";
NSLog(@"大写:%@", );
NSLog(@"小写:%@", );
// 首字母变大写,其他字母变小写
NSLog(@"首字母变大写:%@", [@"aGE" capitalizedString]);
</code></pre>
<h5>字符串的比较</h5>
<pre><code>// 检测字符串的内容是否相同
BOOL result = [@"abc" isEqualToString:@"abc"];
NSLog(@"%i", result);
NSLog(@"'a' =%i ,'A' = %i", 'a','A');
//'a' =97 ,'A' = 65
// NSOrderedAscending右边的字符串比左边大
// NSOrderedSame两个字符串的内容相同
// NSOrderedDescending左边的字符串比右边的大
NSComparisonResult result2 = [@"abc" compare:@"Abc"];
if (result2 == NSOrderedSame) {
NSLog(@"两个字符串的内容相同");
} else if (result2 == NSOrderedAscending) {
NSLog(@"右边 > 左边");
} else if (result2 == NSOrderedDescending) {
NSLog(@"右边 < 左边");
}
//右边 < 左边
</code></pre>
<h5>字符串的搜索</h5>
<pre><code>NSString *str = @"123456456.txt";
NSLog(@"是否以22开头:%i", );//0
NSLog(@"是否以txt结尾:%i", );//1
// 搜索字符串
NSRange range = ;
// range.length == 0
if (range.location == NSNotFound) {
NSLog(@"不能找到");
} else {
NSLog(@"找到的范围是:%@", NSStringFromRange(range));//{3, 3}
}
// 从尾部开始搜索字符串
range = ;
NSLog(@"从尾部开始搜索:%@", NSStringFromRange(range));//{6, 3}
// 指定范围进行搜索
range = ;
NSLog(@"指定范围进行搜索:%@", NSStringFromRange(range));//{3, 3}
</code></pre>
<h5>字符串的截取</h5>
<pre><code>NSString *str = @"123456";
// 从索引3开始截取到尾部(包括3)
NSLog(@"%@", );//456
// 从头部开始截取到索引3之前(不包括3)
NSLog(@"%@", );//123
// 指定范围进行截取
NSRange range = NSMakeRange(2, 3);
NSLog(@"%@", );//345
NSString *str2 = @"a-b-c-d-5";
NSArray *array = ;
NSLog(@"%@", array);//(a,b,c,d,5)
NSString *str3 =;
NSLog(@"%@", str3);//a
</code></pre>
<h5>与路径相关</h5>
<pre><code>// 快速创建一个自动释放的数组
NSMutableArray *components = ;
;
;
;
// 将数组中的所有字符串拼接成一个路径
NSString *path = ;
NSLog(@"%@", path);//Users/MJ/Desktop
// 将路径分解成一个数组
NSArray *cmps = ;
NSLog(@"%@", cmps);//(Users,MJ,Desktop)
// path是一个字符串常量,是不可变的
path = @"/users/mj/test";
// 判断是够为绝对路径(依据是前面有无/)
NSLog(@"%i", );//1
NSLog(@"最后一个目录:%@", );//test
// 删除最后一个目录
NSLog(@"%@", );///users/mj
// 在最后面拼接一个目录
NSLog(@"%@", );///users/mj/test/abc
</code></pre>
<h5>拓展名处理</h5>
<pre><code>NSString *str = @"/User/MJ/test.txt";
NSLog(@"拓展名:%@", );//txt
// 删除拓展名
NSLog(@"%@", );///User/MJ/test
// 添加拓展名
NSLog(@"%@", [@"abc" stringByAppendingPathExtension:@"mp3"]);//abc.mp3
</code></pre>
<h5>其他用法</h5>
<pre><code>//NSString 转int
NSString *str = @"12";
int a = ;
NSLog(@"%i", a);//12
// 计算字数,不是计算字符数
NSLog(@"length=%zi", [@"我是字符串123" length]);//length=8
// 取出对应的字符
unichar c = [@"abc" characterAtIndex:0];
NSLog(@"%c", c);
// 返回C语言中的字符串
const char *s = [@"abc" UTF8String];
NSLog(@"%s", s);//abc
</code></pre>
<h4>3. Foundation-NSMutableString</h4>
<h5>可变字符串的创建</h5>
<pre><code>// 预先分配10个字数的存储空间
NSMutableString *str = [ initWithCapacity:10];
//this is ok
NSMutableString *str = [init];
// 设置字符串内容
;
// 拼接一个字符串
;
// 拼接字符串
;
//1234567age is 27 and height is 1.55
// 替换字符串
NSRange range = ;
//NSRange range = NSMakeRange(7, 3);
;
//1234567age is 27 and no is 1.55
// 插入字符串
;
//12abc34567age is 27 and no is 1.55
// 删除字符串
range = ;
;
NSLog(@"%@", str);
//12abc34567 is 27 and no is 1.55
// 释放对象
;
</code></pre>
<h4>4. Foundation-NSArray</h4>
<h5>创建一个数组</h5>
<pre><code>// 创建一个空的数组
NSArray *array = ;
// 创建有1个元素的数组
array = ;
// 创建有多个元素的数组
array = ; //count = 3
int count = ;
// count = array.count;
NSLog(@"%i", count);
</code></pre>
<h5>数组的简单使用</h5>
<pre><code>NSObject *obj = [ init];
NSArray *array = ;
// 判断是否包含了某个元素
if () {
NSLog(@"包含了字符串a");
}
NSString *last = ;
NSLog(@"last=%@", last);//
NSString *str = ;
NSLog(@"%@", str);
int index = ;
NSLog(@"index=%i", index);
;
</code></pre>
<h5>数组的内存管理</h5>
<pre><code>Student *stu1 = [ init];
Student *stu2 = [ init];
Student *stu3 = [ init];
NSLog(@"stu1:%zi", );//1
// 当把一个对象塞进数组中时,这个对象的计数器会加1,也就是说数组会对它做一次retain操作
NSArray *array = [ initWithObjects:stu1, stu2, stu3, nil];
NSLog(@"stu1:%zi", );//2
NSLog(@"count=%zi", array.count);//3
;//1
;
;
// 数组被销毁的时候,会对内部的所有元素都做一次release操作
;//0
</code></pre>
<h5>给数组里面的元素发送消息</h5>
<pre><code>Student *stu1 = ;
Student *stu2 = ;
Student *stu3 = ;
NSArray *array = ;
// 让数组里面的所有对象都调用test方法
;
// 让数组里面的所有对象都调用tes2t方法,并传递一个
;
</code></pre>
<h5>遍历数组</h5>
<pre><code>Student *stu1 = ;
NSArray *array = ;
//方法1
int count = array.count;
for (int i = 0; i<count; i++) {
// id == void *
id obj = ;
NSLog(@"%i-%@", i, obj);
}
//方法2
// 快速遍历
int i =0;
for (id obj in array) {
NSLog(@"%i-%@", i, obj);
i++;
}
//方法3
[array enumerateObjectsUsingBlock:
^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%i-%@", idx, obj);
// 如果索引为1,就停止遍历
if (idx == 1) {
// 利用指针修改外面BOOL变量的值
*stop = YES;
}
}];
//方法3输出:
//0-<Student: 0x100102e40>
//1-1
//方法4
// 获取数组的迭代器
// NSEnumerator *enumerator = ;
// 反序迭代器(从尾部开始遍历元素)
NSEnumerator *enumerator = ;
// allObjects是取出没有被遍历过的对象
NSArray *array2 = ;
NSLog(@"array2:%@", array2);
// 获取下一个需要遍历的元素
id obj = nil;
while (obj = ) {
NSLog(@"obj=%@", obj);
}
</code></pre>
<h5>派生出新的数组</h5>
<pre><code>NSArray *array = ;
NSArray *array2 = ;
NSArray *array3 = ];
NSLog(@"array:%@", array);//(1,2)
NSLog(@"array2:%@", array2);//(1,2,3)
NSLog(@"array3:%@", array3);//(1,2,4,5)
NSArray *array4 = ;
NSRange range = NSMakeRange(1, 2);
NSArray *array5 = ;
NSLog(@"array5:%@", array5);//(2,3)
</code></pre>
<h5>数组的其他用法</h5>
<pre><code>NSArray *array = ;
// 1-2-3-4
// 利用分隔符-拼接所有的数组元素
NSString *str = ;
NSLog(@"%@", str);
// 将一个数组写入文件(生成的是一个xml文件)
NSString *path = @"/Users/apple/Desktop/array.xml";
;
path = @"/Users/apple/Desktop/array.txt";
//上面写入的xml文件,此处也可以直接读取
// 从文件中读取数组内容(文件有严格的格式要求),格式如下
//<array>
// <string>1</string>
// <string>2</string>
// <string>3</string>
// <string>4</string>
//</array>
NSArray *array2 = ;
NSLog(@"array2:%@", array2);
</code></pre>
<h5>数组排序</h5>
<ul><li>排序1</li></ul>
<pre><code>NSArray *array = ;
// 返回一个排好序的数组,原来数组的元素顺序不会改变
// 指定元素的比较方法:compare:
// compare two NSDecimalNumbers
NSArray *array2 = ;
NSLog(@"array2:%@", array2);//(1,2,3,4)
</code></pre>
<ul><li>排序2、3</li></ul>
<pre><code>Student *stu1 = ;
Student *stu2 = ;
Student *stu3 = ;
Student *stu4 = ;
NSArray *array = ;
方法1
// 指定排序的比较方法
NSArray *array2 = ;
//compareStudent 是什么,见下一个代码块
//方法2
// 利用block进行排序
NSArray *array2 = [array sortedArrayUsingComparator:
^NSComparisonResult(Student *obj1, Student *obj2) {
// 先按照姓排序
NSComparisonResult result = ;
// 如果有相同的姓,就比较名字
if (result == NSOrderedSame) {
result = ;
}
return result;
}];
NSLog(@"array2:%@", array2);
//("","","","")
</code></pre>
<pre><code>其中compareStudent是Student的一个方法,如下:
- (NSComparisonResult)compareStudent:(Student *)stu {
// 先按照姓排序
NSComparisonResult result = ;
// 如果有相同的姓,就比较名字
if (result == NSOrderedSame) {
result = ;
}
return result;
}
</code></pre>
<ul><li>排序4</li></ul>
<pre><code>Student *stu1 = ;
Student *stu2 = ;
Student *stu3 = ;
Student *stu4 = ;
NSArray *array = ;
// 1.先按照书名进行排序
// 这里的key写的是@property的名称
NSSortDescriptor *bookNameDesc = ;
// 2.再按照姓进行排序
NSSortDescriptor *lastnameDesc = ;
// 3.再按照名进行排序
NSSortDescriptor *firstnameDesc = ;
// 按顺序添加排序描述器
NSArray *descs = ;
NSArray *array2 = ;
NSLog(@"array2:%@", array2);
//("","","","")
</code></pre>
<h4>5. Foundation-NSMutableArray</h4>
<h5>用法如下</h5>
<pre><code>NSMutableArray *array = ;
// 添加元素
;
;
//移除元素
;
;
;
//替换元素
;
//排序
;
//此处array发生变化,区别NSArray
</code></pre>
<h5>NSMutableArray的内存管理</h5>
<pre><code>NSMutableArray *array = [ init];
Student *stu1 = [ init];// stu1:1
stu1.age = 10;
Student *stu2 = [ init];// stu2:1
stu2.age = 20;
// 对被添加的元素做一次retain操作,计数器+1
; // stu1:2
; // stu2:2
NSLog(@"add->stu1:%zi", );
// 对被删除的元素做一次release操作,计数器-1
; // stu1:1
NSLog(@"remove->stu1:%zi", );
// 释放学生
; // stu1:0
; // stu2:1
// 当数组被释放的时候,会对所有的元素都做一次release操作
; // stu2:0
</code></pre>
<p>IOS开发之OC基础学习笔记(上)<br> IOS开发之OC基础学习笔记(中)<br> IOS开发之OC基础学习笔记(下)</p>
</div>
<div id="MySignature" role="contentinfo">
<p>本文来自博客园,作者:清霜辰,转载请注明原文链接:https://www.cnblogs.com/cnjim/p/18443520</p><br><br>
来源:https://www.cnblogs.com/cnjim/p/18443520
頁:
[1]