oc学习笔记(十)Foundation

一、 结构体

NSRange (location length)两个属性

NSPoint \ CGPoint 一般用后者(跨平台),下面几个也一样用后者

NSSize \ CGSize 

NSRect \ CGRect

1.NSRage 范围

#import 

int main(int argc, const char * argv[])
{
//    struct Date {
//        int year;
//        int month;
//        int day;
//    };
//    struct Date d = {2011, 1, 9};
//    
//    @"i love oc" ;//求love 的范围
//    
//    NSRange r1 = {2, 3}; //可读性不好,一般不用
//    NSRange r2 = {.location = 2, .length =4}; //太冗余了,也不用
//    NSRange r3 = NSMakeRange(2, 4); // 掌握
    
    NSString *str = @"i love you";
    //查找某个字符串在str中的范围
    //如果找不到 ,length=0, location=NSNotFound==-1(以%d方式打印出来是-1,如果以%ld打印出来是很大的一个数)
    NSRange range = [str rangeOfString:@"i"];
    
    NSLog(@"loc=%ld, length = %ld", range.location, range.length);
    return 0;
}


2. CGPoint 可以带表一个点

3. CGSize 可以代表一块尺寸区域

4.CGRect (CGPoint CGSize)

    CGPoint p1 =NSMakePoint(10,20);

    CGPoint p2 = CGPointMake(10,20);

    CGSize s1  = CGSizeMake(100,50);

    CGRect r1 =CGRectMake(30,40,100,50);

还可以如下:

    

    CGRect r2 = {{10,20},{100,50}};

    

    CGRect r3 = {p1,s1};

    

    CGRect r4 = {CGPointZero, CGSizeMake(100, 50)};


   //将结构体转换成字符串

    NSString *str =NSStringFromPoint(p1);

同理还有

    NSString *str2 =NSStringFromSize(s1);

  NSLog(@"%@",str);


5.比较两个点是否相同(x,y)

    //比较两个点是否相同

    BOOL b = CGPointEqualToPoint(CGPointMake(10,20),CGPointMake(10,20));

    //比较范围是否相同

    BOOL b2 = CGSizeEqualToSize(CGSizeMake(100,50),CGSizeMake(100,50));

    //判断一个点是否在范围内

    BOOL b3 =CGRectContainsPoint(CGRectMake(50,40,100,50),CGPointMake(130,70));


二、字符串

    //NSString : 不可变字符串

    //NSMutableString: 可变字符串

    //mutable就是可变的意思

   


    NSString *s1 = @"jack";

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

  //c字符串--》OC字符串,注意后面没有@

    NSString *s4 = [[NSStringalloc]initWithUTF8String:"jack"];

   //OC 字符串 -->c 字符串

     const char *s5 = [s4UTF8String];

//读取文件

    NSString *s5 = [[NSStringalloc]initWithContentsOfFile:@"/Users/apple/Desktop/abc/aaa.c"encoding:NSUTF8StringEncodingerror:nil];

    NSLog(@"%@",s5);

url是万能的


    // URL:资源路径

    // 协议头:路径

    // file://

    // ftp://

    // http://weibo.com.a.png

    

  NSURL *url = [[NSURLalloc]initWithString:@"file:///Users/apple/Desktop/abc/aaa.c"];//需要协议头

    //下面这种不需要协议头

   NSURL *s9 = [[NSURL alloc] initFileURLWithPath:@"/Users/apple/Desktop/abc/aaa.c"];

    NSString *s7 = [[NSStringalloc]initWithContentsOfURL:urlencoding:NSUTF8StringEncodingerror:nil];

   

 //一般都有对应的类方法,而且一般用类方法来调用。

    [NSURL URLWithString:<#(NSString *)#>] //相当对应上面的方法

    //[NSString stringWithFormat:@"age is %d",age]

    [NSString stringWithContentsOfFile:<#(NSString *)#> encoding:<#(NSStringEncoding)#> error:<#(NSError *__autoreleasing *)#>


//写文件

   注意,需要添加CoreGraphics.framework 

    [@"jack jack"writeToFile:@"/Users/apple/Desktop/abc/a1.c"atomically:YESencoding:NSUTF8StringEncodingerror:nil];

//atomicall:yes 安全,如果写入失败,不会创建。


//可变字符串

    NSMutableString *s1 = [NSMutableStringstringWithFormat:@"age is 10"];

    //拼接字符串

    [s1 appendString:@"11 12"];

    

    //获取is的范围并且删除,不论字符串位置在哪

    NSRange range = [s1 rangeOfString:@"is"];

    [s1 deleteCharactersInRange:range];

   

    //而不可变字符串只可以拼接后赋值给新的字符串

    NSString *s2 = [NSString stringWithFormat:@"age is 10"];

    NSString *s3 = [s2stringByAppendingString:s2];

    

三、集合类

1.NSArray 对象数组(不可变)有序;

 // OC数组只能存放OC对象、不能存放非对象类型,比如int、struct、enum等

//这个array永远是空数组

//NSArray *array = [NSArray array];

  1>array简单使用

    NSArray *array2 = [NSArrayarrayWithObject:@"jack"];

    //nil结束村志

    NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose", nil];

    

    //NSArray的元素个数

    NSLog(@"%ld", array2.count);

    

    //NSArray中元素的访问

    NSLog(@"%@",[array3 objectAtIndex:1]);

    //由于编译器特性,array3[1]等价于上边

    NSLog(@"%@",array3[0]);

    Person *p = [[Personalloc]init];

    

2>array遍历数组

    NSArray *array = @[p, @"rose", @"jack"];

    

    //第一种遍历数组

    

    for (int i =0; icount; i++) {

        NSLog(@"%@",array[i]);

    }

   //第二种

    for (id objin array) {

        NSUInteger i =[array indexOfObject:obj];

        NSLog(@"%ld-%@", i, obj);

    }


    //第三种方式用block

    [array enumerateObjectsUsingBlock:

     ^(id obj,NSUInteger idx,BOOL *stop) {

         NSLog(@"%ld - %@", idx, obj);

if (idx ==0)

{

//停止遍历

*stop = YES;

 }

     }];


1.2.可变数组NSMutableArray 的使用

    //创建可变数组并添加元素

    NSMutableArray *array = [NSMutableArrayarrayWithObjects:@"rose",@"rose",@"jim",nil];

    // NSMutableArray *array = [NSMutableArray array];

    

    //添加元素

    [array addObject:[[Person alloc] init]];

    

    [array addObject:@"jack"];

    

    //错误写法,不能放空值

    //[array addObject:nil];

    

    //删除元素

    //[array removeObject:@"jim"];

    //删除全部

    //[array removeAllObjects];

    //删除指定位置元素

    //[array removeObjectAtIndex:0];

    

    NSLog(@"%@", array);;


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

1.2.1>

//@[ ]这种方式只能创建不可变数组,返回类型为 NSArray *
所以如下是错误写法,会报经典错误,找不到方法。

    /*

    NSMutableArray *array = @[@"jack",@"jim"];

    [array addObject:@"rose"];

     */


2.另外三种集合类(无序)

一、NSSet

 NSSetNSArray的对比

 1> 共同点

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

 * 只能存放OC对象,不能存放非OC对象类型(基本数据类型:intcharfloat等,结构体,枚举)

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

 

 2> 不同点

 * NSArray有顺序,NSSet没有顺序

 */




    // 永远是空的Set

    NSSet *s = [NSSet set];

    

    NSSet *s2 = [NSSet setWithObjects:@"jack", @"rose",@"jim", nil];

    

    // 随机返回个变量

    NSSet *str = [s2 anyObject];

    

    NSLog(@"%@", str);

    

    //NSLog(@"%ld", s2.count);

    

    //  可变Set

    NSMutableSet *s3 = [NSMutableSetset];

    

    //添加元素

    [s3 addObject:@"jack"];

    

    //删除元素(只能删除全部或者某个元素)

    // [s3 removeObject:<#(id)#>];


二、字典

1.NSDictionary

    //第一种方法,只能创建一个

    NSDictionary *dict1 = [NSDictionarydictionaryWithObject:@"jack"forKey:@"name"];

    

    //第二种方法创建多个

    NSArray *key =@[@"name",@"age",@"address"];

    NSArray *objects = @[@"jack",@"23",@"北京"];

    NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:objects forKeys:key];

    

    // 第三种

    NSDictionary *dict3 = [NSDictionarydictionaryWithObjectsAndKeys:

                         @"jack",@"name",

                         @"北京",@"address",

                         @"3232342",@"qq",nil];

    //第四种,编译器特性, (注:这种方式仅能给不可变字典使用,返回值类型为NSDictionary)

    NSDictionary *dict4 =@{@"name" :@"jack",@"address" :@"北京",@"qq" :@"4324234"};

    

    // 能过某个key找到对应的值

    id obj = [dict4 objectForKey:@"qq"];

    

    //编译器特性等价于上面的

    id obj2 = dict4[@"qq"];

    

    NSLog(@"%@", obj2);


2.NSMutableDictionary

    NSMutableDictionary *dict = [NSMutableDictionarydictionary];

    

    //添加键值对

    [dict setObject:@"jack" forKey:@"name"];

    

    [dict setObject:@"北京"forKey:@"address"];

    

    //添加一样的key,则会覆盖

    [dict setObject:@"rose" forKey:@"name"];

    

    //移除键值对

    //[dict removeObjectForKey:<#(id)#>];

    

    NSString *str = dict[@"name"];


    NSLog(@"%@", str);

 

3.遍历字典

    // 字典不允许有相同的key,但允许有相同的value(Object)
    // 字典的无序的
    NSDictionary *dict = @{
    @"address" : @"北京",
    @"name" : @"jack",
    @"name2" : @"jack",
    @"name3" : @"jack",
    @"qq" : @"7657567765"};
    
    //    NSArray *keys = [dict allKeys];
    //
    //    for (int i = 0; i

//想用有序字典,场景,联系人,可用如下方式,用数组存放字典
    
    NSArray *persons = @[
                         @{@"name" : @"jack", @"qq" : @"353432", @"books" : @[@"5分钟学会ios", @"5分钟突破android编程"]},
                         @{@"name" : @"rose", @"qq" : @"9890897897"},
                         @{@"name" : @"jim", @"qq" : @"89079879"}
      ];
    // 特殊写法
    // 1.先取出字典中qq这个key对应的数据
    NSLog(@"%@", persons[2][@"qq"]);
    
    NSLog(@"%@", persons[0][@"books"][1]);
    
    NSLog(@"%@", persons[1]);

三、NSNumber 和NSValue


1.NSNumber 把基本数据类型包装成对象

    NSNumber *num = [NSNumbernumberWithInt:20];

    

    NSDictionary *dict = @{@"name":@"jack",

                          @"age" : num

                          };

    NSNumber *num2 = dict[@"age"];

    

    int a = [num2 intValue];


    NSNumber *n = [NSNumbernumberWithDouble:10.5];

    

    int d = [n doubleValue];

    

    int a = 20;

    

    //将整型转成字符串

    NSString *str = [NSString stringWithFormat:@"%d", a];

    

    //[str intValue];等价于下面

    //[@"20" intValue];

    

    //又一个编译器特性

    //@20;

    //相当于

    [NSNumbernumberWithInt:20];

    

    //还有

    @10.5;// NSNumber对象

    

    @YES;// NSNumber对象

    

    @'A';// NSNumber对象

    

    @"A";// NSString对象

    

    int age =20;

    

    @(age);// NSNumber对象


2.NSValue 

//NSNumber 之所以能包装基本数据类型,是因为继承了NSValue,

NSValue 可以把结构体包装成对象


    //下面是一个结构体

    CGPoint p = CGPointMake(10,10);

    //把结构体包装成oc对象

    NSValue *value = [NSValue valueWithPoint:p];

    

    //然后就可以把value放进数组里了

    NSArray *array = @[value];

    

    //再转回结构体

    cgpoint p2 = [value pointerValue];


四、NSDate 时间


    NSDate *date = [NSDatedate];

    //打印出来是0时区的时间 (北京是东8区需要加上8小时)

    NSLog(@"%@", date);

    

    NSDate *date2 = [NSDatedateWithTimeInterval:200sinceDate:date];

    

    NSTimeInterval seconds = [date2 timeIntervalSince1970];

    

    NSLog(@"%@", date2);


日期格式


    NSDate *date = [NSDatedate];

    

    //日期格式化类

    NSDateFormatter *formatter = [[NSDateFormatteralloc]init];

    //yM月 d

    //m s H(24) h(12)

    formatter.dateFormat =@"yyyy-MM-dd HH:mm:ss";


    @"2011-09-10 17:56:45";

    

    NSString *str = [formatter stringFromDate:date];

    //打印出来的是当前的时间

    NSLog(@"%@", str);


把字符串的时间转换成NSDate类型

    NSString *time =@"2013/09/10 18:56";

    

    NSDateFormatter *formater = [[NSDateFormatteralloc]init];

    formater.dateFormat =@"yyyy/MM/dd HH:mm";

    

    NSDate *date = [formater dateFromString:time];

    

    NSLog(@"%@", date);


五、NSObject 中常用用法
 
//
//  main.m
//  Foundation15-NSObject
//
//  Created by mj on 13-4-7.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import 
#import "Student.h"
#import "Person.h"

#pragma mark NSObject常用方法
void objUse() {
    Student *stu = [[[Student alloc] init] autorelease];
    
    // isKindOfClass判断对象是否属于某个类 或者 子类
    if ( [stu isKindOfClass:[Person class]] ) {
        // NSLog(@"stu属于Person或者继承自Person");
    }
    
    // isMemberOfClass判断对象是否属于某个类(不包括子类)
    BOOL result = [stu isMemberOfClass:[Student class]];
    // NSLog(@"%i", result);
    
     // 还有以前的两种如下
     // conformsToProtocol:判断是否遵守了某个协议
        if ([stu conformsToProtocol:@protocol(Study)]) {
            NSLog(@"Student遵守了Study这个协议");
        }
        
      // respondsToSelector:判断是否实现了某个方法
        if ( ![stu respondsToSelector:@selector(test)] ) {
            NSLog(@"Student没有实现test这个方法");
        }
 
    
    // 直接调用
    // [stu test];
    
    // 间接调用
    [stu performSelector:@selector(test)];
    // [stu performSelector:@selector(test2:) withObject:@"abc"];
    // 延迟2秒后调用test2:方法
    [stu performSelector:@selector(test2:) withObject:@"abc" afterDelay:2];
}

void reflect() {
    // 类的反射
    NSString *str = @"Person";
    Class class = NSClassFromString(str);
    
    Person *person = [[class alloc] init];
    NSLog(@"%@", person);
    
    
    // Class变成字符串
    NSString *name =  NSStringFromClass([Person class]);
    
    
    // 方法的反射
    NSString *method = @"test";
    SEL selector = NSSelectorFromString(method);
    [person performSelector:selector];
    
    // 将SEL转换为字符串
    NSString *selectorName = NSStringFromSelector(selector);
    
    
    [person release];
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        reflect();
    }
    return 0;
}



你可能感兴趣的:(object-c基础)