——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
在不改变原来类模型的前提下,给类扩充方法,除了可以利用继承特性设计一个子类外,还可以通过设置分类来完成。
分类的格式:
分类的声明:
@interface 类名(分类名称)
......
@end
分类的实现:
@implementation 类名(分类名称)
......
@end
示例1:
#import
@interface Person : NSObject //类的申明
@property int age;
@property NSString *name;
@property double height;
- (void)run;
- (void)jump;
@end
@implementation Person //类的实现
- (void)run
{
NSLog(@"跑起来了");
}
- (void)jump
{
NSLog(@"跳起来了");
}
@end
@interface Person (Liyi) //声明Person的分类,取名为LiYi
- (void)shoot;//在分类中给Person扩充一个方法shoot
@end
@implementation Person(LiYi) // 类的实现
- (void)shoot//实现这个扩充的方法
{
NSLog(@"LiYi shoot");
}
@end
int main()
{
Person *per = [Person new];//创建一个Person对象
[per shoot]; //per调用分类中扩充的方法shoot
return 0;
}
该实例运行的结构为 LiYi shoot
1、可以将一个大的类分为多模块的开发
2、多模块的开发有利益团队开发,提高效率。
例如:
模块一:
#import
#import "Grab.h"
@interface Person : NSObject
@property(nonatomic, assign)int age;
@property(nonatomic, assign)int height;
- (void)jump;
- (void)run;
@end
模块二:
#import
#import "Person.h"
int main() // 主函数的调用,分模块的调用
{
id
[obj potholing];
return 0;
}
模块三:
#import "Person.h" // 声明的文件调用
@implementation Person //类的实现
- (void)jump
{
NSLog(@"跳跃");
}
- (void)run
{
NSLog(@"奔跑");
}
- (void)potholing
{
NSLog(@"开挖掘机挖坑");
}
@end
以上都是运用多分类模块,由主函数主类的调用
+load方法:在程序启动的时候会加载所有的类和分类,并自动调用所有类和分类的+load方法,先加载父类再加载子类也就是先调用父
类的+load方法再调用子类的+load方法。此外先加载原始类再加载子类。不管程序运行过程中有没有用到这个类,都会调用+load加
载。
+initialize方法:在第一次使用某个类时(比如创建对象等),就会调用一次+initialize方法,一个类只会调用一次+initialize方
法,先调用父类的再调用子类的
获取类对象的方法:
方法1:
Class c = [Person class];
方法2:
Person *p = [Person new]; // 运用指针传地址
Class c = [p class];
简单的代码块的运用输出:
我们在打印输出某个类,通常会使用NSLog 函数来输出 和“%@”格式转换符,返回值一个整型,输出自己默认返回
#import
int main()
{
int a = 5, b = 9;
int (^Sum)(int, int) = ^(int x, int y){
return x + y;
};
int sum = Sum(a, b);
NSLog(@"sum = %@", sum);
return 0;
}
示例13展示了代码块的简单应用,运行结果是:
sum = 14