OC学习之道:OC中类别--Category类目的使用/Eetension类的扩展 的使用

来源:互联网 发布:Date java 编辑:程序博客网 时间:2024/05/23 10:06
/ Objective-C中的类目(Category)的使用.1.类目,2.扩展,3.协议
        //为什么使用类目,通过继承来实现某项功能话,有点大材小用的感觉,因为我们有时候只需要实现一个方法,所以继承就大了,没必要,而且NSString是不允许继承的
        //创建类目文件是在cocoa的object-c category项目下创建
    //1.类目
        //1.1为没有源码的类型扩展功能(一般读系统提供的类,因为我们看不到该类的.m文件)
        //1.2扩展的功能将会成为原类的一部分
        //1.3通过类目可以给原始类添加功能(方法)但是不能给原始类添加实例变量
        //1.4类目可以覆盖方法,但是不会再执行之前的那个方法了,而是调用新的方法

////  main.m//  Copyright (c) 2015年 tongxing. All rights reserved.//#import <Foundation/Foundation.h>#import "NSString+SayHi.h"#import "NSDate+ChangeType.h"int main(int argc, const char * argv[]){    @autoreleasepool {#pragma mark----Category类目的使用                        NSString *str1 = @"刘亦菲";        NSString *str2 = @"张飞";        [str1 HelloGG];//self调用自身:str1        [str2 HelloMM];       // [NSString test];//类方法        //作业1:使⽤用Category为NSDate类添加⼀一个类⽅方法(dateWithDateString:),实现将下述字符串转换为NSDate对象。 将@“20140402142850”转换为NSDate。       NSDate *result= [NSDate dateWithDateString:@"2013-12-10 10:30:00"];        NSLog(@"%@",result);                                         #pragma mark----Eetension类的扩展             //Extension针对的是⾃己的类,必须有源代码的类        //1.延展可以添加实例变量,但是类目不可以        Person *person = [[Person alloc]init];                [person work];                int result1 = [person factorial:2];//外界我们只需要传入参数2就行了,不需要知道怎么实现的        NSLog(@"%d",result1);        }return 0;} ////  NSString+SayHi.h//  Copyright (c) 2015年 tongxing. All rights reserved.//#import <Foundation/Foundation.h>@interface NSString (SayHi)-(void)HelloMM;-(void)HelloGG;+(void)test;@end////  NSString+SayHi.m//  Copyright (c) 2015年 tongxing. All rights reserved.//#import "NSString+SayHi.h"@implementation NSString (SayHi)-(void)HelloMM{    NSLog(@"哈喽,刘亦菲,我是%@",self);}-(void)HelloGG{    NSLog(@"哈喽,童星%@",self);}+(void)test{    NSLog(@"%@",self);}@end<pre name="code" class="html"><br/>

////  Person.m//  Copyright (c) 2015年 tongxing. All rights reserved.//#import "Person.h"@interface Person (private)//private省去也是没有关系//以下为私有方法,只能在类的内部(当前的Person类)访问,外界是访问不到的,-(void)_showInfo;-(int)squre:(int)count;//求平方-(int)factorial:(int)number;//求阶乘@end//类的延展的语法形式如上,就相当于C中函数的声明@implementation Person{    int _number;    //在这里定义属性,这个属性也是私有的    //但是这种方式和之前定义的@private的区别    //两者的区别就是一个在.h文件中定义的,一个是.m文件中定义的    //如果是开源的话,一般是开放.h和.m文件    //如果是闭源的话,一般只开放.h文件}//私有方法,只是在.m文件中定义了,没有在.h文件中声明,一般是在本类中自己使用的-(int)squre:(int)count{    return count*count;}//求平方-(int)factorial:(int)number{//该方法是需要声明的,它相当于一个借口,供外界传入参数进行使用    int result = 1;    int value = [self squre:number];//本类自己调用私有方法先求平方    //计算平方之后的阶乘    for (int i=1; i<=value; i++) {        result = result*i;    }    return result;    }//求阶乘-(void)work{        [self _showInfo];        NSLog(@"开始工作了");}-(void)_showInfo{    NSLog(@"我的信息");}@end////  Person.h//  Copyright (c) 2015年 tongxing. All rights reserved.//#import <Foundation/Foundation.h>@interface Person : NSObject{    NSString *_name;    int _age;}-(void)work;-(int)factorial:(int)number;@end

                                             
0 0