黑马程序员--OC基础之类的符合与category的使用

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


1.类的复合

首先先上代码演示一下:

Dog.h

<span style="font-size:18px;">#import <Foundation/Foundation.h>

@interface Dog : NSObject

@property (assign, nonatomic)int age;
@property (copy, nonatomic)NSString *name;
@property (copy, nonatomic)NSString *color;

- (void)run;

@end</span>

Dog.m

#import "Dog.h"

@implementation Dog

- (void)run{
    NSLog(@"Dog running.........");
}

@end

Person.h

#import <Foundation/Foundation.h>
#import "Dog.h"//包含dog类声明的头文件

@interface Person : NSObject

@property (assign, nonatomic)int age;
@property (copy, nonatomic)NSString *name;
@property (assign, nonatomic)float height;
@property (retain, nonatomic)Dog *dog;//Person类中包含了一个Dog类的对象

- (void)run;

@end

Person.m

#import "Person.h"

@implementation Person

- (void)run{
    NSLog(@"Person running.........");
}

@end

main.m

#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Person.h"

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

    @autoreleasepool {
        Dog *xiaobai = [[Dog alloc] init];//实例化一个xiaobai对象
        //点语法调用setter方法
        xiaobai.age = 1;
        xiaobai.name = @"xiao bai";
        xiaobai.color = @"white";
        
        Person *xiaoxin = [[Person alloc] init];//实例化一个person类的对象
        xiaoxin.age = 5;
        xiaoxin.name = @"也原新之助";
        xiaoxin.height = 110.0;
        xiaoxin.dog = xiaobai;//xiaoxin养了一只xiaobai
        
        //打印xiaoxin的相关信息
        NSLog(@"person age is %d name is %@ height is %f", xiaoxin.age, xiaoxin.name, xiaoxin.height);//点语法调用getter方法
        //打印xiaoxin养的xiaobai的相关信息
        NSLog(@"person have a dog age is %d name is %@ color is %@", xiaoxin.dog.age, xiaoxin.dog.name, xiaoxin.dog.color);
        //xiaoxin跑了起来,xiaobai也跟着跑起来
        [xiaoxin run];
        [xiaoxin.dog run];
    }
    return 0;
}

看到这,你也许就明白了一大半,所谓类的复合,就是在另一个类中,用这个类声明一个变量,接收此类对象。

附:

@class#import的区别

当用类的包含时就要用@class

@class:类的前置声明,只是相当于高度系统class后面是一个类,至于类中的细节(实例变量,方法)系统不知道

#import:类的声明头文件包含,不仅告诉系统""<>里面是一个类,并且连同类中的细节(实例变量和方法)一同告诉系统


2.分类category

 分类就是在不改变本有的类的基础上给这个类增加新的方法,在以后上线的程序更新中可以使用,它和类的区别是,它不可以增加实例变量,下面上代码:

student.h

#import <Foundation/Foundation.h>

@interface Student : NSObject
@property (assign,nonatomic)int age;
@property (copy,nonatomic)NSString *name;
@end
student.m

<span style="font-size:18px;">@implementation Student
@synthesize age=_age;
@synthesize name=_name;
@end</span>

这个类中我没有给它任何方法

接下来上category类

CategoryToStudent.h

<span style="background-color: rgb(255, 255, 255);">#import "Student.h"

@interface Student (CategoryToStudent)

- (void)descStudent;
@end</span>

CategoryToStudent.m

<span style="background-color: rgb(255, 255, 255); ">#import "Student+CategoryToStudent.h"

@implementation Student (CategoryToStudent)

- (void)descStudent{

    NSLog(@"name is %@,age is %i",self.name,self.age);
}
@end</span>
这样我就给student的这个类增加了打印姓名和年龄的方法

你也可以尝试着给系统类增加一些方法,例如,NSArry:

CategoryToArray.h

@interface NSArray (CategoryToArray)
- (void)descArray;
@end

CategoryToArray.m

#import "NSArray+CategoryToArray.h"

@implementation NSArray (CategoryToArray)

- (void)descArray{
    for (id i in self) {
        NSLog(@"%@",i);
    }

}
@end
main中就可以通过下面这样打印数组成员了

        NSArray *array=[[NSArray alloc]initWithObjects:@"i",@"am",@"a",@"shuai",@"man",nil];
        [array descArray];


总结:开始的时候我也很纠结,为什么要写这么多的类,岂不是更麻烦,明明主函数中几行就搞定了呀!但是后来我在做一个象棋的小程序时,不由自主的就想到了把一些方法重写,把一些功能封装成类,类不仅使代码变的简洁,而且还是我们的工作变的方便!











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值