天天看点

黑马程序员_object c学习日记_复习Foundation

-------------------------------------- android培训、java培训、ios培训期待与您交流! ---------------------------------

包含Foundation头文件

#import <Foundation/Foundation.h>

结构体

NSRange:表示范围,location位置(unsignedlong),length长度(unsigned long)

NSPoint\CGPoint:表示一个点,x(CGFloat\double),y(CGFloat\double)

NSSize\CGSize:表示ui的尺寸,width宽度(CGFloat\double),height高度(CGFloat\double)

NSRect\CGRect:表示位置大小,CGPoint和CGSize

//
//  main.m
//  Foundation中的结构体
//
//  Created by zhouxf on 14-4-17.
//  Copyright (c) 2014年 zhouxf. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    // NSRange
    //@"i love oc" // love的范围
    // 位置2,长度4
    NSRange r1 = {2, 4};
    NSRange r2 = {.location = 2, .length = 4};
    NSRange r3 = NSMakeRange(2, 4); // 需要掌握
    
    NSString *str = @"i love oc";
    
    // 查找某个字符串在特定字符串的范围
    // 如果找不到,length = 0,location = NSNotFound == -1
    NSRange range = [str rangeOfString:@"love"];
    
    // NSPoint\CGPoint
    NSPoint p1 = NSMakePoint(11, 11);
    CGPoint p2 = CGPointMake(1, 1); // 最常用
    // CG开头函数是在CoreGraphics框架定义的,运行时需要将其加入
    
    // 表示原点
    //CGPointZero == CGPointMake(0, 0)
    
    // 点与点比较
    CGPointEqualToPoint(CGPointMake(1, 1), CGPointMake(11, 11));
    
    // NSSize\CGSize
    NSSize s1 = NSMakeSize(1, 1);
    CGSize s2 = CGSizeMake(11, 11); // 开发中常用CG
    
    //CGSizeZero == CGSizeMake(0, 0)
    
    // 比较尺寸
    CGSizeEqualToSize(CGSizeMake(1, 1), CGSizeMake(1, 1));
    
    // NSRect\CGRect
    CGRect rt1 = CGRectMake(0, 0, 10, 10);
    CGRect rt2 = {{0, 0}, {11, 11}};
    
    //CGRectZero == CGRectMake(0, 0, 0, 0)
    
    // CGRect比较
    CGRectEqualToRect(CGRectMake(0, 0, 1, 1), CGRectMake(0, 0, 1, 1));
    
    // CGRect是否包含点
    CGRectContainsPoint(CGRectMake(11, 11, 22, 22), CGPointMake(33, 33));
    
    // 将结构体装化为字符串
    NSString *str1 = NSStringFromRange(r1);
    NSLog(@"%@", str1);
    NSString *str2 = NSStringFromPoint(p1);
    NSLog(@"%@", str2);
    NSString *str3 = NSStringFromSize(s1);
    NSLog(@"%@", str3);
    NSString *str4 = NSStringFromRect(rt1);
    NSLog(@"%@", str4);
    
    return 0;
}
           

Foundation中的常用类

NSString:不可变字符串

NSMutableString:可变字符串

/*
     NSString:不可变字符串
     NSMutableString:可变字符串
     */
    // 1.字符串的创建
    NSString *s1 = @"jack";
    NSString *s2 = [[NSString alloc] initWithString:s1];
    NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d", 11];
    
    // c字符串转oc字符串
    NSString *s4 = [[NSString alloc] initWithUTF8String:"jack"];
    
    // oc字符串转c字符串
    const char *cs = [s4 UTF8String];
    
    // 从文件中读取内容
    NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/zhouxf/Documents/code/other/other/main.m" encoding:NSUTF8StringEncoding error:nil];
    
    //URL:资源路径
    // 协议头://路径
    // 本地资源 file://
    // ftp://
    // http://
    NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
    //file:///Users/zhouxf/Documents/code/other/other/main.m
    NSString *s6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
    
    NSLog(@"%@", s6);
    /*
     NSString类中有对象方法initWithXXX,一般就有对应的对象方法stringWithXXX与之配对
     其他类也是如此
     [NSString stringWithFormat:<#(NSString *), ...#>] == [[NSString alloc] initWithFormat:<#(NSString *), ...#>]
     */
    
    // 将字符串写入文件,writeToFile\writeToURL
    [@"jack\nrose" writeToFile:@"/Users/zhouxf/Documents/code/test.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
    
    // 拼接内容到字符串后创建新字符串
    NSString *ns = [s1 stringByAppendingString:@"rose"];
    
    // 可变字符串
    NSMutableString *ms1 = [NSMutableString stringWithFormat:@"age is 10"];
    
    // 直接将拼接到可变字符串后面
    [ms1 appendFormat:@"%d %d", 11, 1];
    
    // 删除某个范围的字符串
    NSRange range = [ms1 rangeOfString:@"is"];
    [ms1 deleteCharactersInRange:range];
    
           

(NSArray、NSSet、NSDictionary统称为集合类)

NSArray:不可变数组

NSMutableArray:可变数组

l  有序;

l  快速创建(不可变):@[obj1,obj2, obj3]

l  快速访问元素:数组名[i]

// 集合类
    /*
     NSArray:不可变数组
     NSMutableArray:可变数组
     */
    // oc数组不能存放nil值
    // oc数组只能存放oc对象、不能存放非oc对象类型,比如int、struct、enum等
    
    //这个array就是空数组,而且不可变
    //NSArray *array = [NSArray array];
    
    NSArray *array2 = [NSArray arrayWithObject:@"jack"];
    // nil是数组元素结束的标记
    NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose", @"jim", nil];
    
    // 快速创建oc数组对象,编译器特性
    NSArray *array4 = @[@"jack", @"rose"];
    
    // 获取数组元素个数
    //[array2 count];
    NSLog(@"%ld", array2.count);
    
    // 访问数组元素
    NSLog(@"%@", [array3 objectAtIndex:1]);
    NSLog(@"%@", array3[1]); // 编译器新特性,使用c数组访问方式
    
    // 遍历数组
    for (int i = 0; i < array3.count; i++) {
        NSLog(@"%@", array3[i]);
    }
    
    // 快速遍历数组
    // id obj 代表着数组中的每一个元素
    for (id obj in array3) {
        // obj在数组中的位置
        NSUInteger i = [array3 indexOfObject:obj];
        NSLog(@"%ld:%@", i, obj);
    }
    
    // 每遍历一个元素就调用一次block
    // 并且把当前元素和位置当作参数传给block
    // stop:停止标志符, *stop = YES时停止遍历
    [array3 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%ld:%@", idx, obj);
        
        if (idx == 1) {
            *stop = YES;
        }
    }];
    
    // 创建可变数组
    NSMutableArray *ma = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil];
    
    // 增加元素
    [ma addObject:@"jack"];
    [ma addObject:@"jack1"];
    [ma addObject:@"jack2"];
    
    // 删除指定对象的元素
    [ma removeObject:@"jim"];
    
    // 删除指定位置的元素
    [ma removeObjectAtIndex:0];
    
    // 删除最后元素
    [ma removeLastObject];
    
    // 删除所有元素
    [ma removeAllObjects];
    
           

NSSet:不可变set

NSMutableSet:可变set合

l  无序

与NSArray比较:

1.    共同点

都是集合,都能存放多个oc对象

只能存放oc对象,不能存放非oc对象(int、char、float等,结构体,枚举)

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

2.    不同点

NSArray有序,NSSet无序

/*
     NSSet:不可变set
     NSMutableSet:可变字set
     */
    // 创建不可变set
    NSSet *set1 = [NSSet setWithObjects:@"jack", @"rose", nil];
    
    // 随机访问一个元素
    NSString *str = [set1 anyObject];
    
    // 创建可变set
    NSMutableSet *mset = [NSMutableSet set];
    
    // 增加元素
    [mset addObject:@"jack"];
    [mset addObject:@"jack1"];
    
    // 删除元素
    [mset removeObject:@"jack"];
    
           

NSDictionary:不可变字典

NSMutableDictionary:可变字典

l  无序

l  快速创建(不可变):@{key1:obj1,key2:obj2, key3:obj3}

l  快速访问元素:字典名[key]

/*
     NSDictionary:不可变字典
     NSMutableDictionary:可变字典
     */
    // 创建不可变字典
    NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];
    
    NSArray *keya = @[@"name", @"age", @"address"];
    NSArray *obja = @[@"jack", @11, @"北京"];
    NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:obja forKeys:keya];
    
    NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:
                          @"jack", @"name",
                          @"北京", @"address"
                          ,nil];
    
    // 快速创建字典,编译器特性
    NSDictionary *dict4 = @{@"name": @"jack", @"address": @"北京"};
    
    // 访问元素
    [dict objectForKey:@"name"];
    
    // 快速访问元素,编译器特性
    id obj = dict[@"name"];
    
    // 创建可变字典
    NSMutableDictionary *md = [NSMutableDictionary dictionary];
    
    // 增加或更新元素
    [md setObject:@"jack" forKey:@"name"];
    [md setObject:@"北京" forKey:@"address"];
    [md setObject:@"rose" forKey:@"name"];
    [md setObject:@"1111" forKey:@"qq"];
    
    // 删除元素
    [md removeObjectForKey:@"name"];
    
    NSLog(@"%@", md);
    
    // 遍历
    NSArray *ka = [md allKeys];
    for (int i = 0; i < md.count; i++) {
        NSLog(@"%@:%@", ka[i], md[ka[i]]);
    }
    
    // 遍历
    [md enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@=%@", key, obj);
    }];
    
           

NSNumber:数字类,将数字包装成oc对象

// 数字转NSNumber

NSNumber *num = [NSNumbernumberWithInt:11];

// NSNumber转数字

int i =[num intVaule];

@20; // 快速创建NSNumber对象,编译器特性

@10.1; //同上

@YES; //同上

@’a’; //同上

int age = 20;

@(age);//同上

NSVaule:能将任何数据类型都能包装成oc对象

// 将结构体CGPoint包装成NSVaule对象

NSVaule *v = [NSVaulevauleWithPoint:CGPointMake(1, 1)];

// 从NSVaule对象获取CGPoint的值

[v pointVaule];

NSDate:日期类

/*
     NSDate:日期类
     */
    // 创建时间对象(当前时间)
    NSDate *date = [NSDate date];
    
    // 打印的时0时区时间
    NSLog(@"%@", date);
    
    // 创建比date晚5秒的时间对象
    NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date];
    
    // 计算utc时间,单位:秒
    /*double*/NSTimeInterval sec = [date2 timeIntervalSince1970];
    
    // 日期格式化类
    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    
    // 设计日期格式
    // y 年 M 月 d 日
    // m 分 s 秒 H (24)时 h (12)时
    df.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    
    // 日期转字符串
    NSString *ds = [df stringFromDate:date2];
    
    NSLog(@"%@", ds);
    
    NSString *time = @"2011/11/11 11:11";
    df.dateFormat = @"yyyy/MM/dd HH:mm";
    
    // 字符串转时间
    NSDate *dt = [df dateFromString:time];
    
    NSLog(@"%@", dt);
    
           

练习:计算代码行数

//
//  main.m
//  计算文件行数
//
//  Created by zhouxf on 14-4-9.
//  Copyright (c) 2014年 zhouxf. All rights reserved.
//

#import <Foundation/Foundation.h>

NSUInteger linesFromFile(NSString *path)
{
    // 获取文件管理者(单列对象)
    NSFileManager *fm = [NSFileManager defaultManager];
    
    // 是否是目录标志符
    BOOL isDir = NO;
    // 判断路径是否存在
    BOOL isEx = [fm fileExistsAtPath:path isDirectory:&isDir];
    
    // 路径不存在
    if (!isEx) {
        NSLog(@"the file of path:%@ is no exist!", path);
        return 0;
    }
    
    // 是目录
    if (isDir) {
        NSUInteger count = 0;
        // 获取目录中的内容:即文件和子目录
        NSArray *nameArray = [fm contentsOfDirectoryAtPath:path error:nil];
        
        // 遍历
        for (NSString *name in nameArray) {
            // 拼接全路径
            NSString *fileName = [NSString stringWithFormat:@"%@/%@", path, name];
            // 递归计算行数
            count += linesFromFile(fileName);
        }
        
        return count;
    } else {
        // 获取文件扩展名(忽略大小写)
        NSString *extension = [[path pathExtension] lowercaseString];
        
        // 对文件进行过滤
        if (![extension isEqualToString:@"h"]
            && ![extension isEqualToString:@"c"]
            && ![extension isEqualToString:@"m"]) {
            return 0;
        }
        
        // 读取文件内容
        NSString *fileContents = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
        
        // 通过换行符分割
        NSArray *fileLines = [fileContents componentsSeparatedByString:@"\n"];
        
        // 去掉文件的公共路径
        NSRange range = [path rangeOfString:@"/Users/zhouxf/Documents/code/"];
        NSString *file = [path stringByReplacingCharactersInRange:range withString:@""];
        
        // 打印文件路径和行数
        NSLog(@"%@:%ld", file, fileLines.count);
        
        // 返回行数
        return fileLines.count;
    }
}

int main(int argc, const char * argv[])
{
    NSString *path = @"/Users/zhouxf/Documents/code";
    NSUInteger count = linesFromFile(path);
    NSLog(@"lines count = %ld", count);
    return 0;
}
           

-------------------------------------- android培训、java培训、ios培训期待与您交流! ---------------------------------