OC中Foundation框架知识总结


一个框架(Framework)就是一个软件包,它包含多个类。Mac 操作系统提供了几十个框架,从而帮助软件开发人员迅速地在Mac 系统上开发应用程序。在这些框架中,有一

些称为基础框架。基础框架就是为了所有程序开发提供基础的框架,其中的类包括:字符串(NSString)、数字(NSNumber)、数组(NSArray)、字典(NSDictionary)、

集合(NSSet)等,所有的基础框架上的类都同用户界面无关,也不是用来构筑用户界面。这也是区分基础框架和非基础框架的区别。

我们在学基础的时候,经常是写这样的语句:

#import <Foundation/Foundation.h>

我们也可以导入我们要使用的类的头文件:

#import <Foundation/NSString.h>

OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现有的类和功能提供给我们使用。那

么今天首先来介绍一下Foundation框架中的第一个类NSObject

在之前介绍了类的相关知识,我们看到我们自定义的类都必须实现NSObject类,这个类内部有很多现有的方法可以供我们使用,比如我们经常使用的alloc和init方法,就是

NSObject提供的,下面就在来看一下他的一些其他常用方法:


NSString(不可变字符串)

字符串创建(initWithFormat)

NSString *str1 = @"Something string..";

NSString *str3 = [[NSString alloc]initWithFormat:@"age is %d",10];


isEqual方法:

//isEqual方法  
NSObject *obj1 = [[NSObject alloc] init];  
NSObject *obj2 = [[NSObject alloc] init];  
          
if([obj1 isEqual:obj2]){  
     NSLog(@"obj1 == obj2");  
}else{  
     NSLog(@"obj1 != obj2");  
}  
          
//或者直接用等号判断  
if(obj1 == obj2){  
     //do something...  
}else{  
     //do something...  
}  

他的作用就是判断两个指针变量是否指向同一个对象,在OC中他还有一个简单的用法,就是直接使用"=="来进行比较,这两个效果是一样的,但是在Java中是不同的,Java中

的"=="是判断两个引用变量是否指向同一个对象,但是其equals方法是判断两个对象的值是否相等(这里的值指的是基本类型,其他对象类型,可以重写这个方法来进行操作)。

respondsToSelector方法:

//respondsToSelector方法  
//判断类中是否有特定的方法(有实现的方法全部返回YES,如果只在.h文件中定义了,返回的是NO)  
//同时这种方式可以实现调用所谓的私有方法  
Person *task = [[Person alloc] init];  
isBelongTo = [task respondsToSelector:@selector(invoke)];  
if(isBelongTo){  
}else{  
}  

这个方法我们在之前的文章中使用过了,他的作用就是判断一个类中是否有某个方法,他的判断是只要这个方法有实现,就返回YES

如果只在.h文件中定义了,没有在.m文件中实现的话,也是返回NO的

如果这个方法没有在.h文件中定义,但是在.m文件中有实现的话(私有方法),返回YES

只要方法在.m文件中有才会返回YES

这个方法的功能如果在Java中可以使用反射去实现


performSelector方法:

- (void)invoke{  
    NSLog(@"invoke is Executing...");  
    [self demo1];//对象调用  
      
    //performSelector方法调用  
    NSString *result = [self performSelector:@selector(demo1)];  
    NSLog(@"%@",result);  
      
    //调用有一个参数的方法  
    [self performSelector:@selector(demo2:) withObject:@"jiangwei"];  
      
    //调用有两个参数的方法  
    [self performSelector:@selector(demo3:withName:) withObject:@"jiangwei" withObject:@"man"];  
      
    //延迟调用一个方法  
    //此处的延迟调用,代码不会停留在此处,为了不阻塞线程  
    [self performSelector:@selector(demo1) withObject:NULL afterDelay:2.5];  
      
    //如果没有以下代码的话,上面的延迟调用就不会有效果的,因为他不会阻塞当前线程,所以当前线程中后续的代码会继续执行  
    //在main.m中得main方法中,会直接return,这样程序就运行结束了,所以来不及执行2.5s之后方法执行  
    //以下代码让执行过程停在此处  
    [[NSRunLoop currentRunLoop] run];  
      
}  
  
- (NSString *)demo1{  
    NSLog(@"demo1");  
    return @"demo1";  
}  
  
- (void)demo2:(NSString *)str{  
    NSLog(@"str = %@",str);  
}  
  
- (void)demo3:(NSString *)str withName:(NSString *)name{  
    NSLog(@"str = %@,name = %@",str,name);  
}  

这个方法的作用就是调用对象中的一个方法,看到上面的例子,这个方法有很多样式:

无参数样式

[self performSelector:@selector(demo1)]  


一个参数的样式

//调用有一个参数的方法  

[self performSelector:@selector(demo2:) withObject:@"jiangwei"];  


两个参数样式

//调用有两个参数的方法  

[self performSelector:@selector(demo3:withName:) withObject:@"jiangwei" withObject:@"man"];  


但是我们看到上面的调用方式,感觉不到这个方法的用途,因为我们完全可以直接调用demo1方法

[self demo1]  

NSArray(有序不可变集合):

集合只能存放OC对象,不能存放基本类型

创建NSArray:

//集合只能存放OC对象,不能存放基本类型
//创建只有1个集合,并设置一个元素
NSArray *array01 = [NSArray arrayWithObject:@"abc"];

//nil时集合元素的结束标记,不能删除
//集合中也不能定义nil元素
//NSArray *array02 = [NSArray arrayWithObjects:@"abc",@"def", nil];     //不推荐
NSArray *array02 = @[@"abc",@"def"];    //推荐    

获取NSArray的长度

//[array02 count];

//array02.count 返回的是unsigned long
NSLog(@"%ld",array02.count);

访问集合

NSLog(@"%@",[array02 objectAtIndex:1]); //不推荐
NSLog(@"%@",array02[1]);    //推荐

NSMutableArray(有序可变集合):

创建可变集合

//创建一个可变的空集合
NSMutableArray *array = [NSMutableArray array];    

//初始化可变集合时,添加元素
NSMutableArray *array2 = [NSMutableArray arrayWithObjects: @"sss", @"aaa", @"bbb", nil];

//错误,@[]返回的时NSArray,所以不能用@[]创建可变集合NSMutableArray
//NSMutableArray *array3 = @[@"dd",@"dsd",@"dsd"];

添加元素

//给可变集合添加元素
[array addObject:[[Person alloc] init]];
[array addObject:@"jack"];


删除元素

//删除所有元素
[array2 removeAllObjects];

//删除指定元素
[array2 removeObject:@"aaa"];

//删除指定索引的元素
[array2 removeObjectAtIndex:1];

//删除最后一个元素
[array2 removeLastObject];


NSSet和NSMutableSet(无序不可变集合和可变集合):

NSSet 和 NSArray的对比 


共同点: 

1.都是集合,都能存放多个OC对象 

2.只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、float等、结构体、枚举) 

3.都有一个可变的子类,本身不可变

不同点: 

1.NSArray有顺序,NSSet无顺序

NSSet:

/错误,没有意义,创建了一个空的set集合,而且Set是不可变的
//NSSet *s = [NSSet set];

NSSet *s = [NSSet setWithObjects: @"aaa", @"bbb", @"ccc", @"ddd", nil];

//由于NSSet是无序的,所以只能随机取出元素
//随机取出元素
NSString *str = [s anyObject];

NSMutableSet:

NSMutableSet  *s = [NSMutableSet set];

//添加元素
[s addObject:@"hack"];
[s addObject:@"haha"];

//删除所有元素
[s removeAllObjects];

//删除指定元素
[s removeObject:@"haha"];

NSDictionary和NSMutableDictionary(可变和不可变的字典集合):

字典:相当于java中的map 

字典是无序的 

key—-》value 

索引—-》文字内容 

Dictionary中存储的是键值对 

Dictionary中的key不能重复,value可以重复

NSDictionary(不可变字典集合):

//NSDictionary---不可变的字典、无序的
//创建了一个字典,但是只存储了一个键值对
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"luoguankun" forKey:@"name"];

//通过key获取value
NSString *name =  [dict objectForKey:@"name"];
NSLog(@"%@",name);  //luoguankun
//推荐这样访问字典中的value
id obj = dict[@"name"];

//通过传入2个不可变数组NSArray来初始化Dictionary字典集合
NSArray *key = @[@"name",@"address"];
NSArray *value = @[@"罗冠坤",@"北京"];
NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:value forKeys:key];
//如果传入的key没有找到,就返回null,不报错
NSLog(@"%@",[dict2 objectForKey:@"address"]); //北京

//下面的写法可读性很差
NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:
                       @"luoguankun",@"name",
                       @"北京",@"address",nil];

//推荐使用这种方式初始化创建字典
NSDictionary *dict4 = @{@"name": @"luoguankun",@"address": @"北京"};

//返回键值对的个数,不是key+value的个数
int count = dict4.count;


NSMutableDictionary(可变字典集合):

//错误!@{}返回不可变的Dictionary
//NSMutableDictionary *dict = @{@"name",@"luoguankun"};

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

//添加键值对
[dict setObject:@"luoguankun" forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];

//当设置了重复的key时,会覆盖以前的,所以dictionary中的key是唯一的,value可以重复
[dict setObject:@"luo" forKey:@"name"];

NSLog(@"%@",dict[@"name"]); //luo

//删除某个key所指向的键值对
[dict removeObjectForKey:@"address"];

Dictionary字典集合的遍历:

 NSDictionary *dict = @{@"name": @"luoguankun",@"address":@"北京"};

//通过for循环遍历NSDictionary,不推荐
NSArray *keys = [dict allKeys];
for (int i = 0; i < keys.count ; i++) {
    NSString *value = [dict objectForKey:keys[i]];
    NSLog(@"%@---%@",keys[i],value);
}

//推荐使用这种遍历方式,通过block遍历集合
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    NSLog(@"%@-%@",key,obj);

    //打印一次就停止
    *stop = YES;
}];

小例子:计算代码的行数:

#import <Foundation/Foundation.h>

NSUInteger codeLineCount(NSString *);

/*
 考察NSString、NSArray的使用
 NSFileManager
 */
int main(int argc, const char * argv[])
{

    /*
     分割字符串
     NSString *str = @"jack-rose- jim-jake";
     NSArray *array = [str componentsSeparatedByString:@"-"];
     [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
     NSLog(@"%@",obj);
     }];
     */


    NSUInteger count = codeLineCount(@"/Users/guankunluo/Documents/C_Files/");
    NSLog(@"该路径下所有文件共计:%ld行",count);

    return 0;
}


/*
 path:文件全路径
 返回值:代码行数
 */
NSUInteger codeLineCount(NSString *filePath)
{

    //1.获取文件管理者,它是单例类
    NSFileManager *mgr = [NSFileManager defaultManager];

    //2.判断path是文件夹还是文件路径,返回BOOL
    BOOL dir = NO;  //用来标记是否为文件夹
    //这个路径是否存在,等于是返回了两个值,一个是方法返回值,一个是传进去的dir
    BOOL exist = [mgr fileExistsAtPath:filePath isDirectory:&dir];   //这个方法会改变dir,因为传得是地址

    //3.如果路径不存在,就直接返回0
    if (!exist) {
        NSLog(@"路径不存在");
        return 0;
    }

    int count = 0;

    //说明路径存在
    //判断是一个文件夹,还是是一个文件
    if (dir) {

        //NSLog(@"是一个文件夹");

        //装着当前文件夹下的所有内容(文件夹、文件)
        NSArray *array = [mgr contentsOfDirectoryAtPath:filePath error:nil];
        //打印出文件夹中的文件列表
        //NSLog(@"%@",array);


        //根据文件列表,拼接出全路径
        for (NSString *filename in array) {
            NSString *fullPath = [NSString stringWithFormat:@"%@%@",filePath,filename];
            count += codeLineCount(fullPath);
        }

    } else {

        //NSLog(@"是一个文件");

        //4.获取文件的拓展名,并且转换成小写
        NSString *extension = [[filePath pathExtension] lowercaseString];
        if (![extension isEqualToString:@"h"]
            && ![extension isEqualToString:@"m"]
            && ![extension isEqualToString:@"c"])
        {
            //代表文件拓展名,不是m,也不是h,也不是c
            return 0;
        }

        //加载文件内容
        NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];

        //按指定字符串,分割字符串,返回集合
        NSArray *array = [content componentsSeparatedByString:@"
"];

        //控制输出的内容,把根路径换掉
        NSRange range = [filePath rangeOfString:@"/Users/guankunluo/Documents/C_Files/"];
        //替换字符串
        NSString *str = [filePath stringByReplacingCharactersInRange:range withString:@""];

        NSLog(@"%@-%ld",str,array.count);

        return array.count;
    }
    return count;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值