文章目录
前言
一点点拓展
开始介绍Foundation之前我们先来了解一下Cocoa
什么是Cocoa呢?Cocoa是OS
X和iOS操作系统的程序的运行环境。Cocoa由对象组成,而这些对象都继承自NSObject类。并且他们都是基于OC运行环境。
Cocoa
iOS中,Cocoa的框架中最重要最基本的两个框架是Foundation和UIkit,和界面无关的基本类的属于Foundation框架,uikit框架是和界面相关的。
Foundation框架
将Foundation框架中的类进行逻辑分类可以分为一下几类:值对象、集合、操作系统服务(文件系统、URL、进程通信、线程和子任务)、通知、归档和序列化、表达式和条件判断、Objective-C语言服务。
提示:以下是本篇文章正文内容,下面案例可供参考
一、字符串
1.字符串是什么?
字符串就是一连串的字符序列,OC中有两个字符串,NSString和NSMutableString
NSString代表字符序列不可变的字符串
NSMutableString代表字符序列可变的字符串
2.如何创建字符串?
NSString的功能如下:
3.创建NSString对象的几种方式
这里的unichar就是unsigned short的别名
#import<Foundation/Foundation.h>
int main(int argc,char* argv[]){
@autoreleasepool {
unichar data[6]={1,2,3,4,5,6};
//初始化字符串
NSString* str=[[NSString alloc]
initWithCharacters:data length:6];
NSLog(@"%@",str);
char* cstr = "hello";
//将C风格的字符串转换成OC风格
NSString* str2=[NSString stringWithUTF8String:cstr];
NSLog(@"%@",str2);
//将字符串写入指定文件
[str2 writeToFile:@"myFile.txt"
atomically:YES
encoding:NSUTF8StringEncoding
error:nil];
//读取文件内容,用文件内容初始化字符串
NSString* str3=[NSString stringWithContentsOfFile:@"NSStringTest.m"
encoding:NSUTF8StringEncoding
error:nil];
NSLog(@"%@",str3);
}
}
这里是代码运行结果
4.NSString的常用功能
此处介绍了NSString类的用法
#import<Foundation/Foundation.h>
int main(int argc,char*argv[]){
@autoreleasepool {
NSString* str=@"magic";
NSString* person=@"娜娜";
str = [str stringByAppendingString:@",nuonuo"];
NSLog(@"%@", str);
const char* cstr = [str UTF8String];
NSLog(@"获取的C字符串:%s",cstr);
str = [str stringByAppendingFormat:@"%@是一个很好的人",person];
NSLog(@"%@",str);
NSLog(@"str字符个数为:%lu",[str length]);
NSLog(@"str按照UTF—8字符集解码后的字节数为:%lu",[str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
NSString* s1=[str substringToIndex:10];
NSLog(@"%@",s1);
NSString* s2=[str substringFromIndex:5];
NSLog(@"%@",s2);
NSString* s3=[str substringWithRange:NSMakeRange(5, 15)];
NSLog(@"%@",s3);
NSRange pos=[str rangeOfString:@"uo"];
NSLog(@"uo在str中出现的开始位置:%ld,长度为:%ld",pos.location,pos.length);
str = [str uppercaseString];
NSLog(@"%@",str);
}
}
5.可变字符串(NSMutableString)
NSMutableString代表一个字符序列可变的字符串。
NSMutableString是NSString的子类,所以前面介绍的NSString所包含的所有方法,NSMutableString都可以直接使用
#import<Foundation/Foundation.h>
int main(int arcg,char* argv[]){
@autoreleasepool {
NSString* person=@"神奇海娜";
NSMutableString* str=[NSMutableString
stringWithString:@"hello"];
//创建一个NSMutableString对象
[str appendString:@",nuonuo"];
//追加字符串
NSLog(@"%@",str);
//追加带变量的字符串
[str appendFormat:@"%@是一个非常搞笑的人",person];
NSLog(@"%@",str);
//在指定位置插入字符串
[str insertString:@"magic,"atIndex:6];
NSLog(@"%@",str);
//删除从6开始8结束的字符
[str deleteCharactersInRange:NSMakeRange(6,8)];
NSLog(@"%@",str);
//位置从7开始,8结束的所有字符替换成nuonuo
[str replaceCharactersInRange:NSMakeRange(7,8)
withString:@"nuonuo"];
NSLog(@"%@",str);
}
}
结果如下
二、日期和时间
1.日期和时间的创建和初始化
创建NSDate的类方法与实例方法基本相似,只是类方法以date开头,而实例方法以init开头
#import<Foundation/Foundation.h>
int main(int argc, char* argv[])
{
@autoreleasepool{
NSDate* date1=[NSDate date];
NSLog(@"%@",date1);
NSDate* date2=[[NSDate alloc]initWithTimeIntervalSinceNow:3600*24];
NSLog(@"%@",date2);
NSDate* date3=[[NSDate alloc]initWithTimeIntervalSinceNow:-3*3600*24];
NSLog(@"%@",date3);
NSDate* date4=[[NSDate alloc]initWithTimeIntervalSince1970:3600*24*365*20];
NSLog(@"%@",date4);
NSLocale* cn=[NSLocale currentLocale];
NSLog(@"%@",[date1 descriptionWithLocale:cn]);
NSDate* earlier=[date1 earlierDate:date2];
NSDate* later=[date1 laterDate:date2];
switch([date1 compare:date3]){
case NSOrderedAscending:
NSLog(@"date1位于date3之前");
break;
case NSOrderedSame:
NSLog(@"date1与date3日期相同");
break;
case NSOrderedDescending:
NSLog(@"date1位于date3之后");
break;
}
NSLog(@"date1与date3相差%g秒",[date1 timeIntervalSinceDate:date3]);
NSLog(@"date2与现在时间相差%g秒",[date2 timeIntervalSinceNow]);
}
}
结果如下:
2.日期格式器
- 日期格式器:NSDateFormatter
- 功能:完成NSDate与NSString之间的转换
转换步骤如下:
1.创建一个NSDateFormatter对象
2.调用NSDateFormatter的setDateStyle: ,setTimeStyle:方法设置格式化日期,时间的风格。
3.如果需要将NSDate转换为NSString,则调用NSDateFromatter的stringFromDate:方法
如果需要将NSString转换成为NSDate,则调用NSDAteFormatter的dateFromString:方法
代码如下:
#import<Foundation/Foundation.h>
int main(int argc, char* argv[])
{
@autoreleasepool {
NSDate* dt=[NSDate dateWithTimeIntervalSince1970:300*24*366*20];
NSLocale* locales[]={
[[NSLocale alloc]initWithLocaleIdentifier:@"zh_CN"]
,[[NSLocale alloc]initWithLocaleIdentifier:@"en_Us"]
};
NSDateFormatter* df[8];
for(int i=0;i<2;i++){
df[i*4]=[[NSDateFormatter alloc]init];
[df[i*4] setDateStyle:NSDateFormatterShortStyle];
[df[i*4] setTimeStyle:NSDateFormatterShortStyle];
[df[i*4] setLocale:locales[i]];
df[i*4+1]=[[NSDateFormatter alloc]init];
[df[i*4+1] setDateStyle:NSDateFormatterMediumStyle];
[df[i*4+1] setDateStyle:NSDateFormatterMediumStyle];
[df[i*4+1] setLocale:locales[i]];
df[i*4+2]=[[NSDateFormatter alloc]init];
[df[i*4+2] setDateStyle:NSDateFormatterLongStyle];
[df[i*4+2] setDateStyle:NSDateFormatterLongStyle];
[df[i*4+2] setLocale:locales[i]];
df[i*4+3]=[[NSDateFormatter alloc]init];
[df[i*4+3] setDateStyle:NSDateFormatterLongStyle];
[df[i*4+3] setDateStyle:NSDateFormatterLongStyle];
[df[i*4+3] setLocale:locales[i]];
}
for(int i=0;i<2;i++){
switch(i){
case 0:
NSLog(@" china");
break;
case 1:
NSLog(@" american");
break;
}
NSLog(@"SHORT格式的日期格式:%@",[df[i*4] stringFromDate:dt]);
NSLog(@"MEDIUM格式的日期格式:%@",[df[i*4+1] stringFromDate:dt]);
NSLog(@"LONG格式的日期格式:%@",[df[i*4+2]stringFromDate:dt]);
NSLog(@"FULL格式的日期格式:%@",[df[i*4+3] stringFromDate:dt]);
}
NSDateFormatter* df2=[[NSDateFormatter alloc]init];
[df2 setDateFormat:@"公元yyyy年mm月dd日hh时xx分"];
NSLog(@"%@",[df2 stringFromDate:dt]);
NSString* dateStr=@"2022-5-29";
NSDateFormatter* df3=[[NSDateFormatter alloc]init];
[df3 setDateFormat:@"yyyy-mm-dd"];
NSDate* date2=[df3 dateFromString:dateStr];
NSLog(@"%@",date2);
}
}
结果如下:
3.日历与日期组件
为了能分开处理NSDate对象所包含的各个字段的数据,Foundation框架提供了NSCalendar对象,该对象包含如下两个常用方法
1.(NSDateComponents*)components:fromDate:
从NSDate中提取年,月,日时,分,秒各时间字段的信息
2.dataFromComponents:(NSDateComponents*)comps:
使用comps对象包含的年月日时分秒各时间字段的信息来创建NSDate
NSDateComponents对象用于封装年月日时分秒等各个字段的信息。包含了对各个字段的setter和getter方法
从NSDate对象中获取各时间字段的数值步骤如下:
- 创建NSCalendar对象
- 调用NSCalendar的components:fromDate:方法来获取NSDate对象中的各时间字段的数值,该方法返回一个NSDateCoponents对象
- 调用NSDateComponents对象的getter方法来获取各时间字段的数值
使用各时间字段的数值来初始化NSDate对象的步骤如下
- 创建NSCalendar对象
- 创建一个NSDateComponents对象,调用setter方法设置数值
- NSCalendar的dateFromComponents:(NSDateComponents*)方法初始化NSDate对象
#import<Foundation/Foundation.h>
int main(int argc, char* argv[])
{
@autoreleasepool {
NSCalendar* gregorian=[[NSCalendar alloc]
initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate* dt=[NSDate date];
unsigned unitFlags=NSCalendarUnitYear|
NSCalendarUnitMonth |NSCalendarUnitDay |
NSCalendarUnitHour |NSCalendarUnitMinute|
NSCalendarUnitSecond |NSCalendarUnitWeekday;
NSDateComponents* comp=[gregorian components: unitFlags
fromDate:dt];
NSLog(@"现在是%ld年",comp.year);
NSLog(@"现在是%ld月",comp.month);
NSLog(@"现在是%ld日",comp.day);
NSLog(@"现在是%ld时",comp.hour);
NSLog(@"现在是%ld分",comp.minute);
NSLog(@"现在是%ld秒",comp.second);
NSLog(@"现在是%ld星期",comp.weekday);
NSDateComponents* comp2=[[NSDateComponents alloc]init];
comp2.year=2022;
comp2.month=5;
comp2.day=29;
comp2.hour =3;
comp2.minute=34;
NSDate* date=[gregorian dateFromComponents:comp2];
NSLog(@"获取的日期为:%@",date);
}
}
4.定时器
什么时候会用到定时器?
需要让某个方法重复执行
定时器接口部分:
#import <Foundation/Foundation.h>
@interface Timer : NSObject {
NSInteger _index;
NSTimer* _timer;
}
-(void) startMyTimer;
-(void) stopMyTimer;
-(void)timerAction: (NSTimer*) timer;
@end
类的实现
#import "挪挪.h"
@implementation Timer
- (instancetype)init {
if (self = [super init]) {
_index = 1;
[self startMyTimer];
}
return self;
}
- (void)startMyTimer {
_timer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(timerAction:)
userInfo:@"娜娜"
repeats:YES];
}
- (void)stopMyTimer {
[_timer invalidate];
NSLog(@"倒计时结束");
}
- (void)timerAction:(NSTimer *)timer {
NSLog(@"%li次",_index);
_index++;
NSLog(@"%@",timer.userInfo);
if (_index > 10) {
[self stopMyTimer];
}
}
@end
测试结果:
#import "挪挪.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Timer* mytimer = [[Timer alloc] init];
NSRunLoop *loop = [NSRunLoop currentRunLoop];
[loop run];
}
return 0;
}
代码运行结果