OC课程-016: 代理设计模式、Foundation框架


160. 代理设计模式之找朋友

// GFProtocol.h
@protocol GFProtocol <NSObject>
// 遵守这个协议的东西,都可以作为男孩子的女朋友。定义女朋友协议。
@required
- (void)wash;
- (void)cook;
@optional
- (void)job;
@end
// Boy.h,Boy.m
#import "GFProtocol.h"
@interface Boy: NSObject
@property(nonatomic, strong)NSString *name;
@property(nonatomic, assign)int age;
@property(nonatomic, assign)int money;
@property(nonatomic, strong)id<GFProtocol> girlFriend;

-(void)talkLove;
@end

@interface Boy
-(void)talkLove {
    NSLog(@"您好,我回来了。");
    [_girlFriend wash];
    [_girlFriend cook];
    NSLog(@"Goodbye!");
}
@end
// Girl.h,Girl.m
#import "GFProtocol.h"
@interface Girl: NSObject <GFProtocol>
@property(nonatomic,strong)NSString *name;
@end
@implementation Girl
- (void)wash{ // 实现GFProtocol协议定义的方法
    NSLog(@"wash cloth!");
}
- (void)cook{
    NSLog(@"cook food!");
}
@end
// main.m 调用
#import <limits.h>
Boy *b1 = [Boy new];
b1.name = @"Tom";
b1.age = 18;
b1.money = INT3_MAX;

Girl *fj = [Girl new];
fj.name = @"风姐";
b1.girlFriend = fj;
[b1 talkLove];


163. Foundation框架

1. 框架系统或第三方,事先写好的一些功能类。把这些类交给我们使用。

这些类的集合,就叫框架。框架中,,有很多功能相似的类。
Foundation框架: 里面有很多类、函数、定义了一些数据类型。
这个框架中的类有一些最基础的类,NSString、NSObject,其他的框架都是基于Foundation框架的。

2. Foundation框架中常用的类。

3. NSString 是2个护具类型,保存OC字符串, 本质是1个类。

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

使用这些方式创建出来的字符串,是1个空的字符串: @""
NSString 对象就是用来存储字符串的。

2). NSString是OC中最常用的1个类。所以OC提供了更为快捷的创建字符串对象的方式。
使用前缀@
@"Tom"; 本质上是1个NSString对象,这个NSString对象中存储的是"Tom"这个字符串。

NSString *str1 = @"Tom";

a). 本质上是1个NSString对象,这个NSString对象中存储的是"Tom"这个字符串.
b). 将这个字符串对象的地址,返回赋值给str1指针。
NSLog(@"str1 = %@", str1); // str1 = Tom
NSLog(@"str1 = %p", str1); // str1 = 0x1000004235
c). 格式控制符:
%p: 打印指针变量的值 打印地址。
%@: 打印指针指向的对象。


164. NSString字符串的恒定性

a). 简要方法创建字符串对象的时候。NSString *str1 = @"Tom";
使用字符串常量来初始化字符串指针的时候。
这个时候字符串对象,存储在数据段里面。str1指针在栈里面。

当使用NSString的类方法来创建对象的时候,
创建的字符串对象,存储在里面。
NSString *str = [NSString stringWithFormat:@"jack"];

NSString *str = [NSString new];

b). 恒定性

当在内存中创建1个字符串对象之后,这个字符串中的对象(内容)就无法修改。
NSString *str1 = @"jack";
NSLog(@"str1 = %p", str1);
str1 =@"rose";
NSLog(@"str1 = %p", str1);
当重新为字符串指针初始化值的时候,
并不是把str1所指向对象的jack改成rose (并不是修改原来的字符串对象)。
而是重新创建了1个字符串对象,存入rose,将新的字符串对象的地址,赋值给str1指针变量。

原来的字符串对象jack的值,没改变。

c). 当系统准备要在内存当中,创建字符串对象的时候。

会想检查内存中是否有相同内容的字符串对象。搜索的时候分别按照堆区或常量区搜索,不会跨内存区搜索。
如果有,直接指向;
如果没有,才会重新创建。

d). 存储在常量区的数据,不会被回收。除非程序结束。

所以存储在常量区的字符串对象,也不会被回收。
NSString *str1 = @"jack";


165. NSString常用方法

使用频率最高的方法

1). 使用拼接的方式创建1个NSString对象。类方法。
NSString *str = [NSString stringWithFormat:@"大家好,我叫%@,今年%d岁!",@"Tom", 19];
2). 得到字符串的长度
NSUInteger len = [str length];
3). 得到字符串中指定下标的字符:对象方法
返回的是unichar类型的,打印时使用%C.
unichar ch = [str characterAtIndex:1];
NSLog(@"ch = %C", ch);
4). 判断2个字符串的内容,是否相同
BOOL res =[str1 isEqualToString: str1];

  • 不能使用== 来判断2个OC字符串的内容是否相同。

  • == 运算符的作用:比较左右两边的数据是否相同。
    10==10; 比较的是左右两边的数据是否相同。
    a==b; 两边都是变量,比较的是左右两边的变量的值是否相同。
    如果两边是1个指针变量,比较的也是变量的值。只不过指针变量的值是地址。

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

5). 将C字符串,转成OC字符串。

char *str = "jack";
NSString *str1 = [NSString stringWithUTF8String:str];

6). OC字符串转C字符串。

NSString *str1= @"Tom";
char *s = str.UTF8String;

166. 字符串的读写

字符串的读写。

1). 将字符串内容,写入到磁盘上的某个文件之中。
path: 文件的路径
automically:
YES,先将内容写入到临时文件,成功了再将文件搬到指定目录。安全但是效率低。
NO,直接将内容写入到指定的文件。不安全,但是效率高。
encoding: 编码utf-8.
error:(NSError **)error 二级指针,要传入1个NSError指针的地址。
如果写入成功,返回的值就是nil;如果写入失败,就会指向一个错误的对象,该对象描述了发生错误的信息。也可以判断指针的是否是nil,来判断是否写入成功。如果不想知道发生错误的原因,可以直接传nil。

返回值BOOL类型,代表是否写入成功了。

NSString *str = @"abcd";
NSError *err; // 二级指针的使用
BOOL res = [str writeToFile: @"/User/My/Desktop/abc.txt" automically:NO 
encoding:NSUTF8StringEncoding  
error:&err];
if(err != nil) {
    // 写入失败
    NSLog(@"%@", err.localizedDescription);
} else {
    // 写入成功
}

2). 从磁盘上的文件中,读取字符串内容。

NSString *str = [NSString stringWithContentOfFile: @"/User/My/Desktop/abc.txt" 
encoding: NSUTF8StringEncoding
error: nil];

167. NSURL读取字符串

使用URL来读取字符串数据
1). 优势:既可以读取本地磁盘文件,还可以读取网页文件,ftp服务器上的文件。

2). 不同类型的URL地址的写法
a. 本地磁盘文件: file://+路径---->file:///Users/Itcast/Desktop/abc.txt
b. 网页地址: http://www.baidu.com/
c. ftp服务器文件的地址: ftp://server.itcast.cn/1.txt

将不同类型的地址封装在NSURL对象中
a. 从指定资源路径读取文本内容
(nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
b. 将字符串的内容写入到资源路径中
(BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
c. 如果要向网页或者ftp写内容要有权限.

NSURL *u1 = [NSURL URLWithString:@"http://www.itcast.cn"];
    NSString *str = [NSString stringWithContentsOfURL:u1 encoding:NSUTF8StringEncoding error:nil];
    NSURL *u1 = [NSURL URLWithString:@"file:///Users/Itcast/Desktop/abc.txt"];
    NSString *str = @"hehehe"; // 写入字符串
    BOOL res = [str writeToURL:u1 atomically:NO encoding:NSUTF8StringEncoding error:nil];

168. 字符串的比较

字符串比较
1). 不忽略大小写

- (NSComparisonResult)compare:(NSString *)string;
    NSString *str1 = @"hehehe";
    NSString *str2 = @"jack";
    NSComparisonResult res = [str compare:str2];
    swith(res){
        case NSOrderedAscending://str1 < str2
        break;
        case NSOrderedSame://一样大
        break;
        case NSOrderedDescending://str1 > str2
        break;
        default:
        break;
    }

2). 忽略大小写的比较

NSString *str1 = @"rose";
NSString *str2 = @"ROSE";
NSComparisonResult res = [str compare:str2 options:NSCaseInsensitiveSearch];
swith(res){
    case NSOrderedAscending://str1小
    break;
    case NSOrderedSame://一样大
    break;
    case NSOrderedDescending://str2小
    break;
    default:
    break;
}

3). 比较字符串中的数字 的大小(格式相同)

NSString *str1 = @"hehehe001";
NSString *str2 = @"hehehe002";
NSComparisonResult res = [str compare:str2 option:NSNumericSearch];// 只能比格式固定的字符串。
swith(res){
    case NSOrderedAscending://str1小
    break;
    case NSOrderedSame://一样大
    break;
    case NSOrderedDescending://str2小
    break;
    default:
    break;
}

169. 字符串的开始和结束判断

4). 判断是否以某个字符串开头

NSString *str = @"http://www.baidu.com/";
BOOL res = [str hasPrefix:@"http://"];

5). 判断是否以某个字符串结束

NSString *str = @"/Users/Apple/Music/我们不一样.mp3";
BOOL res = [str hasSuffix:@".mp3"];

170. 字符串的搜索

1. 在主串中搜索子串

1). 从前往后
- (NSRange) rangeOfString:(NSString *)searchString;
返回值NSRange类型的结构体变量

typedef struct _NSRange{
   NSUInteger location;//代表子串在主串出现的下标 
  NSUInteger length;//代表子串在主串中匹配的长度 
} NSRange;
NSString *str = @"i love itcast!"; // 在str字符串中搜索@"love"出现的范围 
NSRange range = [str rangeOfString:@"love"]; 
if(range.location==NSNotFound){ 
// 没有找到 
} else {
 // 找到了 
} 
// 或者
 if(range.length==0){ 
    // 没有找到 
} else { 
    // 找到了 
}

2). 从后往前

NSString *str = @"i love itcast love!"; // 在str字符串中搜索@"love"出现的范围 
NSRange range = [str rangeOfString:@"love" options: NSBackwardsSearch]

2. NSRange结构体

1). 是Foundation框架中定义的一个结构体

typedef struct _NSRange{ 
NSUInteger location;//代表子串在主串出现的下标 
NSUInteger length;//代表子串在主串中匹配的长度 
} NSRange;
NSRange range;

// 这个结构体变量一般情况下用来表示一段范围,特别用在子串在主串中的范围.
2). 声明并初始化结构体变量的方式
a. 最原始的方式

NSRange range; 
range.location = 3; 
range.length = 4;

b. 第二种方式: NSRange range = {3, 7};
c. 第三种方式: NSRange range = {.location = 3, .length=7};
d. Foundation框架中定义了一个函数,这个函数可以快速的创建一个NSRange结构体.
NSMakeRange(loc, len); 返回一个指定属性的NSRange结构体变量
NSRange range = NSMakeRange(3,7);

5. 可以将NSRange结构体变量转换为NSString.

NSRange range = NSMakeRange(3,7);
NSString *str = NSStringFromRange(range);

6.字符串截取

1). 取到字符串中的一部分
(NSString *)substringFromIndex(NSUIntege)from;
从指定的下标处一直截取到最后

    NSString *str = @"背景连锁酒店分开计算懒死了";
    NSString *newStr = [str substringFromIndex:3];

2). 从第0个开始截取指定的个数
(NSString *)substringToIndex(NSUIntege)to;
3). 从指定位置截取指定长度的字符串
(NSString *)substringWithRange(NSRange)range;

7.字符串替换

1). (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;
将字符串中第一个参数替换为第二个参数,原来的指针指向的内容是不会变的,新串是以方法的返回值返回的.

NSString *str = @"背景连锁酒店分开计算懒死了";
NSString *newStr = [str stringByReplacingOccurrencesOfString:@"背景" withString:@"广州"];
字符串数据转换为其他类型
@property (readonly)double doubleValue;
@property (readonly)float floatValue;
@property (readonly)int intValue;
@property (readonly)NSUINteger integerValue;
@property (readonly)long long longLongValue;
@property (readonly)BOOL boolValue;

8.转换注意:

其他
1). 去掉字符串前后的空格

NSString *str = @" Jack ";
[str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

2). 将字符串转换为大写或者小写

NSString *str = @" Jack ";
[str uppercaseString];
[str lowercaseString];


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容