iOS APP 开发 OC 第二十三天,Foundation 的 NSString

tags: OC 30 day


近来到台北工作,好久没有吃到好吃的卤肉饭了。
在看Foundation之前,先来了解,什麽是框架?

什麽是框架?

就是系统(apple)或者是第三方(其他高手)事先写好的一些功能,把这些类交给我们使用,这些类的集合我们叫做框架。
框架中有很多很多功能,相似的类,函数库。

Foundation框架:

是一个包,这里面有很多类,函数,定义了一些数据类型。这个框架中的类都是一些最基础的类。NSString NSObject 其他的框架都是基於Foundation框架的。

UIKit.
AVFoundation.
...

Foundation是框架中最常用的类

Foundation 量大又简单

NSString

NSString 是一个数据类型,保存OC字符串。
NSString 的本质是一个类,既然是一个类。

所以,最标准的创建 NSString对象的方式:

NSString *str1 = [NSString new];
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [NSString string];

使用这种方式创建的字符串是一个空的字符。 @""
NSString 对象就是用来储存字符串。

NSString 是 OC中最常用的一个类了,所以OC提供了一种更为快速的创建字符串对象的方式。

使用前缀@

@"jack"; 本质上这是一个NSString 对象。这个NSString对象中储存的是"jack"这个字符串。
NSString *str1 = @"rose";
@rose 本质上是一个NSString 对象,这个对象中储存的是字符串"rose"。
将这个字符串对象的地址返回赋值给str1指针。

格式控制符%p:打印指针变量的值。
%@:打印指针指向的对象。

NSString的恒定性

什麽是恒定性?当我们使用简要的创建对象的时候,也就是使用一个OC字符串量来初始化字符串指针的时候。这个字符串对象是储存在常量区(数据段)的
NSString *str = @"jack";

NSString *str2 = [NSString new];

创建的字符串对象是储存在heap。

当在内存中创建一个字符串对象以後,这个字符串对象的内容就无法修改了。当我们重新为字串指针初始化值得时候,并不是修改原来的字符串对象。而是重新的创建一格字符串对象。将这个字符串对象的地址重新复制给字串指针变量。

当系统准备要在内存中创建字符串对象的时候,会先检查内存是否有相同内容的字符串对象。如果有,直接指向。如果没有才会重新创建。

int main(int argc, char * argv[]) {
    NSString *str1 = @"jack";
    NSString *str2 = [NSString new];
    NSLog(@"\nstr1 = %p\nstr2 = %p",str1,str2);
    NSLog(@"---------------更改----------------");
    str1 = @"wang";
    str2 = @"wang";
    NSLog(@"\nstr1 = %p\nstr2 = %p",str1,str2);
}

str1 = 0x1059891d8
str2 = 0x105ef32f0
2021-02-02 14:17:36.232140+0800 
test3[94276:1268487] ---------------更改----------------
2021-02-02 14:17:36.232319+0800 test3[94276:1268487] 
str1 = 0x105989338
str2 = 0x105989338

储存在常量区的数据不会被回收。所以储存在常量区的字符串对象也不会被回收。

int main(int argc, char * argv[]) {
    NSString *str1 = @"jack";
    NSString *str2 = [NSString new];
    NSLog(@"\nstr1 = %p\nstr2 = %p",str1,str2);
    str1 = @"wang";
    str1 = nil;
    NSLog(@"\nstr1 = %p\nstr2 = %p",str1,str2);
}
str1 = 0x106e101d8
str2 = 0x106e101d8
2021-02-02 14:26:11.164321+0800 test3[94370:1281904] 
str1 = 0x0
str2 = 0x106e101d8

使用最多的几个方法

NSString 是一个类,那麽他铁定有很多方法。

使用拼接方式创建一个NSString物件。

+ (instancetype)stringWithFormat:(NSString *)format, ...

得到字符串的长度

@property (readonly) NSUInteger length;

得到字符串中指定下标的字符

- (unichar)characterAtIndex:(NSUInteger)index;

判断两个字符串的内容是否相同

能否使用 == 来判断两个OC字符串的内容是否相同。
== 预算符的作用,比较左右两边的数据是否相同。
10 == 10 这个时候直接比较的是左右两边的数据。
a == b 两边也可以写一个变量,这个时候直接比较的是左右两边变量的值是否相同。
如果两丢是一个指针变量,那麽比较的也是变量的值。只不过指针变量的值是地址。

所以,如果我们要比较两个OC字符串的内容是否相同,不能使用 == 比较。因为 == 比较的是字符串指针变量的值。而我们要比较的是两个字符串指针指向的字符串对象的内容是否相同。

BOOL res = [str1 isEqualToString:str2];

<<:  【课程推荐】2021/3/6~3/7、3/13~3/14 软件架构师技能培训班

>>:  范围和裁缝(Scoping and Tailoring)

OpenStack Neutron 介绍 — Linux Bridge - Self-Service Networks

本系列文章同步发布於笔者网站 上篇介绍了 Linux Bridge with Provider Ne...

[Day7] Flutter - 堆叠布局 ( Stack、Positioned )

前言 Hi, 我是鱼板伯爵今天要教大家 Stack(堆叠) 和 Positioned(位子),Sta...

★ 2021 IPBC Taiwan|创新科技论坛-智胜5G 领航未来! ★ 经济部工业局 主办 !

★2021 IPBC Taiwan|创新科技论坛-智胜5G 领航未来!★ 经济部工业局 主办! ht...

成为工具人应有的工具包-22 OpenedFilesView

OpenedFilesView 今天来认识 OpenedFilesView 顾名思义应该就是可以看到...

Day 6 - Using ASHX File for User Authorization Management with ASP.NET Web Forms C# 使用泛型处理常式进行权限分流

=x= 🌵 网页操作权限分流处理及 Yacht Manager - Master Page 後台主版...