Objective-C基础

一.OC概述

1. Objective-C概述

  •      Objective-C简称OC,扩充⾃C语⾔的⾯向对象编程语⾔。
  •      是OS X和iOS操作系统的主要编程语⾔。
  •      C语⾔的超集,允许在OC中使⽤C语⾔源代码,编译器兼容C语⾔ 程序。
  •      具备完善的⾯向对象特性。
  •      包含⼀个运⾏时系统。
  •      类库丰富。

 

2. 面向对象编程

  •     分析涉及到的对象
  •     根据功能定义类
  •     使⽤对象的功能完成程序

 

3. 类和对象

  •     类和对象是⾯向对象的核⼼。
  •     类:具有相同特征和⾏为的事物的抽象。
  •     定义类,创建对象,使⽤对象。
  •     对象是类的实例。 类是对象的类型。

 

4.实例变量操作

  •     实例变量在初始化只做少量设置,后期还需要进⾏设置。
  •     实例变量区分可⻅度,共三种。
  •     这节课使⽤public @public:实例变量访问修饰符号(公有)。

 

①.类:具有相同特征和行为的事物的抽象

描述一个类可以分成两部分:

  1. 特征(实例变量)
  2. 行为(方法)

 

②对象:类的实例化表现,可以找到对应的一个实际的事物。

根据类创建对象,创建好的每个对象都拥有类的所有特征和行为(实例变量和方法)

③我们以后的编码步骤

  1. 创建类,对类进行表述;
  2. 创建对象;
  3. 操作对象(实例变量和方法)

④@interface...@end 之间是类的接口部分

Person 类的名字

:后面是该类的父类的名字,表明该类继承于谁。

 

⑤NSObject是所有类的基类,即所有的类都直接或者间接继承于NSObject; 

 

⑥以后所有的类的特征和行为的描述都要写在@interface与@end之间。

 

⑦@public关键字  实例变量的可见度。

 

⑧'-'方法是给对象发送消息 ,'+'方法是给类发送消息

 

⑨类与文件没有本质上的联系,文件是类的载体,但文件不是类。类的名字可以和文件的名字不相同,一个文件里可以写多个类。

 

⑩instancetype和id 都表示任意类型 ,区别instancetype只能做返回值类型;id既可以做返回值类型,又可以做参数的数据类型。

 

⑪只要是对象类型(非基本类型,如:int,long,short,bool等等)都可以用’%@‘输出。

 

⑫ return self;//self谁用谁知道,谁用该方法就指谁

 

⑬创建对象步骤:

  • 类名    *对象名 =[   [类名   alloc ]  init ];
  • 赋值:对象名 -> _特征名=@“...”;
  • 输出:NSLog( @“ %@  “,对象名->实例变量 );
  • 消息发送机制:[ 对象名        方法名(接口) ];

 

总结:⾯向对象和⾯向过程是两种不同的编程思想,思考⾓度不同,前者以 对象为中⼼,后者以事件为中⼼。 类是对象的抽象,对象是类的体现。⾯向对象编程中,先创建出对应 的类,再由类⽣成对象,进⽽完成我们的开发。 类包含接⼝和实现两个部分,对象创建分两步:创建对象、初始化。 public修饰的实例变量,可以直接使⽤“—>”访问

 

_________________________________________________________________________

 

二.OC面向对象

1. 继承

一个子类只有一个父类,但一个父类可以被多个子类继承。

没有一个类的继承性是固定的,其被定义为父类还是子类取决于跟什么类去对比(NSObiect除外,其是基类,无法做子类)。

OC里没有多继承,子类可以继承父类的所有实例变量和方法。

 

2.初始化方法

-(instancetype)initWith…:(参数类型)参数 …:(参数类型)参数 ;

self = [super init]

在自身的初始化方法中,优先向super发送init消息,初始化实例变量,初始化成功后,再初始化自身特有量,从而完成全部实例变量的初始化。

在给本类的实例变量赋值之前,先调用父类的”实现“去初始化父类的实例变量。

做安全判断,如果父类初始化失败,则没有必要再给我本类的实例变量赋值。

super 编译器指令,不是对象 作用:调用父类的方法的实现。

 

3. 便利构造器

+(id)类名With…:(参数类型)参数 …:(参数类型)参数

{

return [[类名 alloc] initWith….];

}

便利构造器:封装类对象的创建过程,使用起来比较方便

 

‘+’方法,类名开头,返回值为该类的实例

 

_________________________________________________________________________

 

三.OC基本类型与数据结构

 

1.NSString

NSString 不可变字符串

    

1.创建字符串

    (1)初始化方法 

    NSString @"hello";

    NSString @"11111";

    NSString *str = [[NSString alloc]initWithFormat:@"%@-word%@"]

    NSLog(@"%@“,str);

    (2)便利构造器方法

    NSString *str1 = [NSString stringWithFormat:@"%@11111111%@",Str,Str1];
    NSLog(@"%@",str1);

   

    

2.字符串长度

    NSUInteger length = [str1 length];
    NSLog(@"%lu",length);

 

    

3.将C语言的字符串转换为OC的字符串对象。

    char cStr[] = "iPhone";
    NSString *ocStr = [NSString stringWithUTF8String:cStr];

    NSLog(@"%@",ocStr);

 

    

4.判断该字符串是否以XX开头或者以XX结尾

    NSString *address = @"www.baidu.com";
    BOOL isSuccess = [address hasPrefix:@"www"];
    NSLog(@"%d",isSuccess);
    BOOL isTrue = [address hasSuffix:@"om"];

    NSLog(@"%d",isTrue);

 

    

5.获取字符串范围

      NSRange 结构体

      location :字符串所在的位置

      length:字符串的长度

      NSStringFromRange 将NSRange结构体变量转换成对象,直接用%@输出。

    NSRange range = [address rangeOfString:@"bai"];
    NSLog(@"%lu %lu",range.location,range.length);
    NSLog(@"%@",NSStringFromRange(range));

 

    

6.字符串截取

    substringFromIndex 得到的字串包含所给的下标对应的字符。

    NSString *result = [address substringFromIndex:1];

    NSLog(@"%@",result);

    substringToIndex 得到的字串不包含所给的下标对应的字符。

    NSString *result1 = [address substringToIndex:5];
    NSLog(@"%@",result1);
    NSString *result2 = [address substringWithRange:NSMakeRange(2, 4)];
    NSLog(@"%@",result2);

 

   

    

7.字符串字母大小转换

    (1).全部转大写

    NSString *upStr = [address uppercaseString];

    NSLog(@"%@",upStr);

    (2).全部转小写

    NSString *lowStr = [upStr lowercaseString];

    NSLog(@"%@",lowStr);

    (3).单词首字母大写

    NSString *headStr = [address capitalizedString];
    NSLog(@"%@",headStr);

 

   

    

8.字符串拼接

    NSString *string = [NSString stringWithFormat:@"shanghai"];
    NSString *appendStr = [string stringByAppendingString:@"lanou"];
    NSLog(@"%@",appendStr);

 

   

    

9.字符串替换

      stringByReplaceOccurrencesOfString:withString:首先再给定的字符串中查找方法中的第一个参数里的字符串,如果找到,将其替换成第二个参数给定的字符串,找到多个,全部替换,找不到,不进行替换。

    NSString *beforeStr = [NSString stringWithFormat:@"shanghailanou0711"];
    NSString *afterStr = [beforeStr stringByReplacingOccurrencesOfString:@"a" withString:@"*"];
    NSLog(@"%@",afterStr);

 

   

10.字符串比较

    NSString *compareStr1 = [NSString stringWithFormat:@"aaa"];
    NSString *compareStr2 = [NSString stringWithFormat:@"aaa"];
    BOOL isEqual = [compareStr1 isEqualToString:compareStr2];
    NSLog(@"%d",isEqual);

 

 

NSMutableString 可变字符串,可以修改其本身;

    

1.创建NSMutableString

    (1).初始化方法

    NSMutableString *mStr=[[NSMutableString alloc]initWithFormat:@"SHS150711"];

    NSLog(@"%@",mStr);

 

    (2).便利构造器

    NSMutableString *mStr1 = [NSMutableString stringWithFormat:@"SHS150711"];
    NSLog(@"%@",mStr1);

 

    

2.插入字符串

    [mStr insertString:@"牛B" atIndex:9];

    NSLog(@"%@",mStr);

 

 

3.删除字符

    [mStr deleteCharactersInRange:NSMakeRange(9, 2)];

    NSLog(@"%@",mStr);

 

    

4.拼接字符串

    [mStr appendFormat:@"wwww%@",mStr];
    NSLog(@"%@",mStr);
    char str[] = {0};
    printf("请输入图片后缀名:\n");
    scanf("%s",str);
    NSMutableString *str1 = [NSMutableString stringWithUTF8String:str];
    if ([str1 hasSuffix:@".png"]) {
        [str1 replaceCharactersInRange:NSMakeRange([str1 length] - 3, 3) withString:@"jpg"];
    }
    else{
        [str1 appendString:@".jpg"];
    }
    NSLog(@"%@",str1);

 

 

2.NSArray

    NSArry 数组对象 属于集合 不可变数组,当NSArray一旦被创建,就不可被改变。
    数组是一个有序的集合,里面只能存放对象。

    

1.创建一个数组

    (1).初始化方式

    NSArray *arr=[[NSArray     alloc]initWithObjects:@"aaaa",@"bbbb",@"cccc",@"dddd",@"eeee",nil];

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

   

    (2).便利构造器

    NSArray *arr1 = [NSArray arrayWithObjects:@"aaaa",@"bbbb",@"cccc",@"dddd",@"eeee", nil];
    NSLog(@"%@",arr1[1]);

 

     

2.数组的元素个数

    NSLog(@"%lu",[arr count]);

 

   

3.获取数组中的某个元素(通过下标) 注意:OC中数组越界立即崩溃~在编码过程中不要使数组越界。

    indexOfObject 给一个对象返回对象在数组中的位置,如果数组中没有该对象,返回垃圾值

    id ss = [arr objectAtIndex:4];
    NSUInteger a = [arr indexOfObject:@"aaaa"];
    id asd = [arr firstObject];
    NSLog(@"%@",ss);
    NSLog(@"%lu",a);
    NSLog(@"%@",arr);

 

  ================================================================================

 

    NSMutableArray 可变数组 会根据数组里元素的增减自动的扩大或者缩小所占的空间。比较灵活,我以后使用较多的是可变数组。

    

 1.创建可变数组

    (1).初始化方法

    NSMutableArray *mArr1 = [[NSMutableArray alloc]initWithCapacity:0];

 

    (2).便利构造器

    NSMutableArray *mArr2 = [NSMutableArray arrayWithCapacity:0];

   

    

2.向可变数组添加对象

    removeAllObjects 删除数组中所有元素

    [mArr1 removeAllObjects];

 

    删除数组中最后一个元素

    [mArr1 removeLastObject];

 

    添加元素

    [mArr1 addObject:@"aaa"];
    [mArr1 addObject:@"aaa"];
    [mArr1 addObjectsFromArray:aii];

 

    按下标删除 对应下标下的元素

    [mArr1 removeObjectAtIndex:0];

 

    插入数组的数组(根据需求来选择插入或者添加);

   [mArr1 insertObject:@"bbbn" atIndex:2];

 

    交换数组内两个元素的位置。

    [mArr1 exchangeObjectAtIndex:0 withObjectAtIndex:1];

    NSLog(@"%@",mArr1);

 

    替换字符串

    [mArr1 replaceObjectAtIndex:[mArr1 count]-1 withObject:@"10010"];

    NSLog(@"%@",mArr1);

 

    判断数组中是否包含某个元素

    [mArr1 containsObject:@"aaa"];

 

    输出数组中的元素:

    for (long i = 0; i < [mArr1 count]; i++) {
        NSLog(@"%@",mArr1[i]);
        NSLog(@"%@",[mArr1 objectAtIndex:i]);
    }

 

 

 

3.NSNumber

NSNumber 数值对象,完成数值标量与对象类型的转换。

    int a = 10;

    将int类型转换成对象。

    NSNumber *objInt = [NSNumber numberWithInt:a];
    NSLog(@"%@",objInt);

   

    将NSNumber对象转回来

    int b = [objInt intValue];
    NSLog(@"%d",b);

   

    

NSValue

    将自定义的结构体转化成NSValue对象。

    valueWithBytes:参数1 objCType:参数2

    参数1:获取要转化成对象的结构体变量的地址。

    参数2:按照对应的结构体类型进行对象的转化。

    Stu stu1 = {"asd",'m'};
    Stu stu2 = {"asd",'f'};
    NSValue *objStrutOrPoint = [NSValue valueWithBytes:&stu1 objCType:@encode(Stu)];
    NSLog(@"%@",objStrutOrPoint);

 

   

    把Value对象转换回自定义结构体变量

    Stu stu;
    [objStrutOrPoint getValue:&stu];
    NSLog(@"%s %c",stu.name,stu.sex);

 


 

4.字典

字典 存放键值对(key --value)的集合,字典中的每一个元素都是键值对
字典是无序的集合,字典中key不能重复
字典可分: 不可变(NSDictionary)和可变(NSMutableDictionary)

   

1.NSDictionary

    (1).初始化方法

    在赋值时,先写值,后紧跟键。

    NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:@"zhangsan",@"name",@"20",@"age", nil];

    NSLog(@"%@",dic);

 

    (2).便利构造器

    在初始化字典时,如果出现多个相同的key,系统只会识别第一个,不会理会后面剩余的对象。

    NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"rain",@"weather",@"bid",@"wind", nil];
    NSLog(@"%@",dic1);

 

   

    2.获取字典中所有的key

    NSArray *keys = [dic1  allKeys];
    NSLog(@"%@",keys);

 

    3.获取字典中所有的Value;

    NSArray *values = [dic1 allValues];
    NSLog(@"%@",values);

 

    4.获取字典中所有相同value的key;

    NSArray *arr=[dic allKeysForObject:@"20"];
    NSLog(@"%@",arr);

 

    5.根据key获取value

    NSArray *arr1 = [dic1 valueForKey:@"weather"];
    NSLog(@"%@",arr1);

 

    6.字典比较

    BOOL ss = [dic isEqualToDictionary:dic1];
    NSLog(@"%d",ss);

   

-----------------------------------------------------------------------------------------------------------------------------

    NSMutableDictionary 可变字典 可以添加,删除,修改键值对

    1.创建可变字典

    (1).初始化方法

    NSMutableDictionary * mdic = [[NSMutableDictionary alloc]initWithCapacity:0];

    (2).便利构造器

  NSMutableDictionary * mdic1 = [NSMutableDictionary dictionaryWithCapacity:0];

 

   

    2.添加键值对

    NSLog(@"%@",mdic);
    [mdic setObject:@"rain" forKey:@"weather"];
    NSArray *arr =  @[@"111",@"222",@"333"];
    [mdic setObject:arr forKey:@"arr"];
    NSDictionary *ddic = [NSDictionary dictionaryWithObjectsAndKeys:@"rain",@"weather",@"big",@"wind", nil];
    [mdic setObject:ddic forKey:@"ddic"];
    NSLog(@"%@",mdic);
    NSArray *arrs = [mdic objectForKey:@"arr"];
    NSLog(@"%@",arrs[1]);

 

   

    3.删除键值对

    (1).根据对应的key删除对象

    [mdic removeObjectForKey:@"weather"];
    NSArray *keyArr = @[@"weather",@"arr"];

    (2).根据传入的数组中的对个key删除多个对象;

    [mdic removeObjectsForKeys:keyArr];
    NSLog(@"%@",mdic);

 

    4.修改键对应的值

    [mdic setObject:@"noRain" forKey:@"weather"];

    如果可变字典添加相同key值的键值对,后一个会覆盖掉前一个的值,最终只会保留最后一个键值对

 

5.集

    NSSet 集合类 不可变 在创建后不可修改集合中的对象,也不可增加,减少集合中的对象的个数。集合是无序的,集合里不允许出现相同的元素。

    1.创建集合

    (1).初始化方法

    NSSet *set = [[NSSet alloc]initWithObjects:@"asd",@"hds",@"gfdg",@"vfds", nil];
    NSLog(@"%@",set);

    (2).便利构造器

    NSSet *set1 = [NSSet setWithObjects:@"aq",@"ee",@"cf",@"ysad", nil];
    NSLog(@"%@",set1);

 

   

    2.集合中元素的个数

    NSLog(@"%ld",[set count]);

    问题:快速去除数组中相同的元素

    答案:把数组放入集合中快速去除数组中多余的元素。

    NSArray *arr = [NSArray arrayWithObjects:@"1",@"2",@"3",@"3",@"4", nil];
    NSSet *set2 = [NSSet setWithArray:arr];
    NSLog(@"%@",set2);
    NSArray *arr1 = [set2 allObjects];
    NSLog(@"%@",arr1);

 

   

    3.获取系统中的每个元素

    NSLog(@"%@",[set anyObject]);
    NSLog(@"%@",[set anyObject]);
    NSLog(@"%@",[set anyObject]);
    NSLog(@"%@",[set anyObject]);
    NSLog(@"%@",[set anyObject]);

   

    4.判断集合中是否包含某个对象

    BOOL isContain = [set1 containsObject:@"aq"];
    NSLog(@"%d",isContain);

   

    NSMutableSet 可变集合

    1.创建一个可变集合

    (1).初始化方法

    NSMutableSet *sett1 = [[NSMutableSet alloc]initWithCapacity:0];

   

    (2).便利构造器

    NSMutableSet *sett2 = [NSMutableSet setWithCapacity:0];

 

   

    2.添加元素

    [sett1 addObject:@"aaa"];
    NSArray *mSetarr = [NSArray arrayWithObjects:@"bbb",@"ccc",@"ddd",@"eee", nil];

    集合中添加一个数组,是把该数组中的元素添加进集合中。

    [sett1 addObjectsFromArray:mSetarr];
    [sett1 removeObject:@"ccc"];
    [sett1 removeAllObjects];
    NSLog(@"%@",sett1);

 

     3.NSCountedSet 计数集合,用来统计集合中元素重复的个数  

    NSCountedSet *countSet = [NSCountedSet setWithObjects:@"1",@"2",@"2",@"3",@"1",@"5", nil];
    NSLog(@"%@",countSet);

        返回给定元素在集合中重复的次数

    NSLog(@"%lu",[countSet countForObject:@"1"]);

 

    4.数组排序

    快速枚举 遍历集合中的对象

    NSArray *arr = [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",@"e",@"f",@"g", nil];
    
    for (id str in arr) {
       NSLog(@"%@",str);
    } 

    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"zhangsan",@"name",@"20",@"age",@"m",@"sex", nil];
    //遍历出来的ss是key
    for (id ss in dic) {
       NSLog(@"%@",[dic objectForKey:ss]);
    }

    NSSet *set = [NSSet setWithObjects:dic, nil];

    for (id str1 in set) {

       NSLog(@"%@",str1);

    }

    

    使用for...in遍历数组的时候不可以删除,添加(不可以改变数组的容量大小)。

    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"5",@"4",@"7",@"2",@"15",@"1", nil];

    [arr sortUsingSelector:@selector(compare:)];
    NSLog(@"%@",arr);
    for (int i = 0; i < [arr count] -1; i++) {
        for (int j = 0; j < [arr count]- i - 1; j++) {
            if ([[arr objectAtIndex:j]intValue]>[[arr objectAtIndex:j+1]intValue]) {
                [arr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
            }
        }
    }

    NSArray *arr1 = [NSArray arrayWithObjects:@"5",@"4",@"7",@"2",@"15",@"1", nil];
    NSArray *sortedArr = [arr1 sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"%@",sortedArr);
    NSLog(@"%ld %ld %ld",NSOrderedDescending,NSOrderedSame,NSOrderedAscending);

 


 

6.Block

函数指针变量里存的是函数名,即函数的首地址。

block变量里存放的是整个函数的实现体。

//该block的类型是:int (^)(int int)

//myblock是该block的名字。

/*
  ^ (int a,int b ){
       return a+b;
    };
    是给myblock赋的初值。

*/

   int (^myblock)(int , int) = ^ (int a,int b ){
      return a+b;
   };

   int result = myblock(10,20);//block是变量,不是指针!!!不可以重指向,只可以重新赋值。

   NSLog(@"%d",result);  


==================================

   void (^block1)() = ^(){
       NSLog(@"hello");
   };

   block1();


   NSString *(^block2)(int ) = ^ (int string){
       return [NSString stringWithFormat:@"%d",string];
   };

   NSString * str = block2(100);

   NSLog(@"%@",str);

  
   //用typedef关键字,给int (^)(int,int)类型重新起一个新名字,方便以后定义。

   typedef int (^newBlock)(int,int);

   newBlock myBlock = ^(int a , int b ){

       return a+b;

   };

   


   //在block的实现体内部不允许修改局部变量的值。如果想要修改,将该局部变量用__block关键字修饰。

   __block int num = 1;
   typedef void (^newblock)();
   newBlock block = ^(){
       int result = ++num * 10;
       NSLog(@"%d",result);
   };
   block();

 


 

7.NSDate

    获取当前的时间点.   

    NSDate *current = [NSDate date];

    //NSLog输出的是零时区的时间

    NSLog(@"%@",current);
   
   
    NSDate *tomorrowDate = [NSDate dateWithTimeIntervalSinceNow:24*60*60];
    //传入一个秒数,返回当前时间加上给定的秒数之后的时间.
    NSLog(@"%@",tomorrowDate);
   
    //根据给定的时间点加上对应的秒数返回一个新的时间.
    NSDate *dates = [NSDate dateWithTimeInterval:24*60*60 sinceDate:tomorrowDate];
    NSLog(@"%@",dates);
   
    //根据传入的秒数,返回2001年1月1号0时0分加上对应的秒数得到的时间
    NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:24*60*60];
    NSLog(@"%@",date);
   
    //根据传入的秒数,返回1970年1月1号0时0分加上对应的秒数得到的时间
    NSDate *datess = [NSDate dateWithTimeIntervalSince1970:60];
    NSLog(@"%@",datess);

    NSDate *currentDate =[NSDate date];
    NSLog(@"%f",[currentDate timeIntervalSince1970]);
   
   
    //返回2001年1月1日到当前时间的秒数.
    NSTimeInterval times = [NSDate timeIntervalSinceReferenceDate];
    NSLog(@"%f",times);
   
   
    NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:- 60 * 60 * 24];
    NSLog(@"%f",[yesterday timeIntervalSinceReferenceDate]);
   
    //timeIntervalSinceDate 返回给定时间与receive时间点之间的秒数.
    NSDate *yes = [NSDate dateWithTimeIntervalSinceNow:- 24 * 60* 60];
    NSDate *tom = [NSDate dateWithTimeIntervalSinceNow:24 * 60 * 60];
    NSTimeInterval ti = [tom timeIntervalSinceDate:yes];
    NSLog(@"%f",ti);

    //=================

     计算当前时间和⼀个固定时间的差值,如果差值在60秒内,输出“刚 刚”,如果在60秒外3600秒内,输出“xx分钟前”,如果3600秒外, 3600*24秒内,输出“xx⼩时前” 。

    NSDate *current = [NSDate date];
    NSDate *dates = [NSDate dateWithTimeInterval:arc4random()%3600*24 sinceDate:current];
    NSTimeInterval times = [dates timeIntervalSinceDate:current];
    if (times < 60) {
        NSLog(@"刚刚");
    }
    else if (times >=60 && times < 3600){
        NSLog(@"%.2f分钟之前",times/60);
    }
    else{
        NSLog(@"%.2f小时之前",times/3600);
    }

   

  

NSDateFormatter

NSDateFormatter 日期格式类,根据设定的格式转化时间(字符串与时间之间的转化).

    NSDateFormatter *formatter = [[NSDateFormatter alloc ]init];

    1.创建日期格式类对象

    2.设置日期格式

        /*
           y 年份
           M 月份
           d 天
           h 24小时制的小时
           m 分钟
           s 秒
        */

    [formatter setDateFormat:@"yyyy年MM月dd日 hh时mm分ss秒"];

    3.将字符串转化为日期对象(将日期对象转化为字符串);

    NSString *dateString = [formatter stringFromDate:[NSDate date]];
    NSLog(@"%@",dateString);
   
   
    NSString *dateStr = @"2015年08月24日 11时56分40秒";
    NSDate *date = [formatter dateFromString:dateStr];
    NSLog(@"%@",date);

 

 

 

 

 

8.Category

  1. Category也叫分类或类目
  2. 主要作⽤是为 没有源代码 的类添加⽅法。
  3. 通过Category添加的⽅法会成为原类的⼀部分。从⽽达到扩展⼀ 个类的功能。

 

如何定义 Category

  1. 新建⽂件
  2. 选择Objective-C Category模板
  3. 填写类名和分类名
  4. .h⽂件添加⽅法声明
  5. .m添加⽅法实现

 

Category的声明

NSString+SayHi.h⽂件

@interface NSString (SayHi)

- (void)hi;

@end

 

 

Category的实现

NSString+SayHi.m⽂件

#import “NSString+SayHi.h”

@implementation NSString(SayHi)

- (void)hi{

    NSLog(@”这是通过category为NSString添加的hi⽅法”);

}

@end

 

 

Category与⼦类的区别

Category与⼦类的区别分类(类目)只能添加方法,不能添加实力变量.


 

 

9.Extension

(1).Extension的主要作⽤是管理类的“私有”⽅法。

(2).⾯向对象编程也叫⾯向接⼝编程。

(3).在设计⼀个类的时候,有些⽅法需要对外公开(我们称为接⼝), 有些⽅法仅仅内部使⽤(⽐如:是某个⽅法的⼀个⼩步骤)。

(4).Extension的功能是帮我们去管理这些内部使⽤的⽅法(“私有”⽅ 法)。

 

定义Extension

  • Extension的语法格式和Category很相似
  • 相当于把Category的.h⽂件挪到了原始类的.m⽂件中
  • Extension针对的是⾃⼰的类,必须有源代码的类

 

xxx.m⽂件

@interface xxx (ExtensionName)

//你的⽅法列表

@end

@implementation xxx

//⽅法的实现

@end

 

 

Category和Extension的区别

 

 

 


 

10.Protocol

  • Protocol(协议),是iOS开发中常⽤的技术。
  • 协议是⼀套标准(⼀堆⽅法的声明),只有.h⽂件。就像⼀张任 务清单(或便利贴),上⾯写了⼀堆需要处理的事。清单交给谁, 谁就要去完成清单上规定的任务。
  • 接受协议的对象实现协议中定义的⽅法。即:清单交给谁,谁就 要去完成清单上规定的任务。

 

定义Protocol

@protocol开始,以@end结束,例如://默认不写或者有@required是必须要实现的协议方法

@protocol MarryProtocol

- (void)makeMoney;

@optional //可选的协议方法

- (void)washcloth;

- (void)cook;

@end

 

遵守协议

遵守协议分两步

  1. 在类的.h⽂件 ⽗类名后写上<协议名>。
  2. 在.m⽂件中实现协议中的⽅法。

相当于给这个类添加了若干个⽅法。这个类的实例就可以调⽤这 些⽅法。

 

 


 

 

11.delegete

Protocol的核⼼使⽤场景是实现delegate设计模式。

delegate(代理)。通俗的讲就是代理商,主要的任务是帮你完 成⼀些任务。

⽐如:保姆就可以认为是delegate,主要的任务是帮你带孩⼦、 做饭、洗⾐服等。

 

使⽤场景:

凡是某些任务⾃⼰不去实现,想让别⼈去实现的时候, 就可以指定⼀个代理,让代理帮你去做。你只需要通知代理去做某 某事。

 

 


 

12.总结:

  • NSDate是iOS中表示日期的类。可以使用NSDateFormatter控制 NSString和NSDate的互转
  • Category能为没有源代码的类添加方法
  • Extension为类管理私有方法
  • Protocol和delegate通常联合使用,是iOS开发中特别常用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter-XK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值