梦想走天涯 發表於 2022-6-7 20:22:00

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(@"右边 &gt; 左边");
} else if (result2 == NSOrderedDescending) {
    NSLog(@"右边 &lt; 左边");
}
//右边 &lt; 左边

</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&lt;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-&lt;Student: 0x100102e40&gt;
//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文件,此处也可以直接读取
// 从文件中读取数组内容(文件有严格的格式要求),格式如下
//&lt;array&gt;
//        &lt;string&gt;1&lt;/string&gt;
//        &lt;string&gt;2&lt;/string&gt;
//        &lt;string&gt;3&lt;/string&gt;
//        &lt;string&gt;4&lt;/string&gt;
//&lt;/array&gt;

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-&gt;stu1:%zi", );

// 对被删除的元素做一次release操作,计数器-1
; // stu1:1

NSLog(@"remove-&gt;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]
查看完整版本: IOS开发之OC基础学习笔记(中) 原创