分類(category)
分類是為了擴展系統(tǒng)類的方法而產(chǎn)生的一種方式。
分類的作用就是在不修改原有類的基礎(chǔ)上籍救,為一個類擴展方法,最主要的是可以給系統(tǒng)類擴展我們自己定義的方法。
分類中可以訪問原來類的成員變量鼠次,但只能訪問@protect和@public形式的變量。
如果要給分類添加成員變量芋齿,則需要寫變量的get腥寇、set方法,否則添加的成員變量無法被調(diào)用觅捆。
需注意一下命名分類命名赦役,如果項目中是給這個類的某些功能寫個分類,那么分類的命名最好不好直接命名為category栅炒。比如有一個Person類掂摔,意思是人類,在person類中我們有一個方法赢赊,-(void)eat;意義是吃乙漓。因為每個人類都會吃,人類有很多共同特點释移,但是也有很多不同點叭披,比如,并不是每個人都會踢足球秀鞭,這時候我寫一個分類趋观,給喜歡運動的人,這個分類的名字叫做sport锋边。因為是Person類的分類皱坛,你會看到生成的名字叫做Person+sport。
如果給一個類定義了兩個分類豆巨,這兩個分類中分別實現(xiàn)了同樣的一個方法剩辟,調(diào)用方法時候,這兩個方法都會被執(zhí)行往扔,所以盡量避免這樣的情況出現(xiàn)是正解贩猎。
使用分類時需引入分類頭文件。
使用(以UIView為例)
1萍膛、創(chuàng)建一個分類
(1)Cmd+N吭服,iOS-->Objective-C File,Next蝗罗;
(2)File Type選擇category艇棕,class選擇需要的類蝌戒,分類名,Next沼琉。
2北苟、分類文件
這是給UIView的frame寫的一個分類
#import <UIKit/UIKit.h>
@interface UIView (Frame)
//添加的成員變量
@property CGFloat origin_x;
@property CGFloat origin_y;
@property CGFloat width;
@property CGFloat height;
//擴展的方法
/**
* @author MX, 16-05-29 15:05:22
*
* 位移(根據(jù)center移動)
*
* @param point
*/
- (void)moveTo:(CGPoint) point;
/**
* @author MX, 16-05-29 15:05:27
*
* 指定比率放大或者縮小
*
* @param scale 指定的比率
*/
- (void)scaleBy:(CGFloat) scale;
@end
#import "UIView+Frame.h"
@implementation UIView (Frame)
@dynamic origin_x;
@dynamic origin_y;
@dynamic width;
@dynamic height;
//實現(xiàn)set、get方法
- (CGFloat)origin_x
{
return self.frame.origin.x;
}
- (CGFloat)origin_y
{
return self.frame.origin.y;
}
- (CGFloat)width
{
return self.frame.size.width;
}
- (CGFloat)height
{
return self.frame.size.height;
}
- (CGFloat)toLeftMargin
{
return self.frame.origin.x+self.frame.size.width;
}
- (CGFloat)toTopMargin
{
return self.frame.origin.y+self.frame.size.height;
}
- (void)setWidth:(CGFloat)width
{
if (width != self.frame.size.width) {
CGRect newframe = self.frame;
newframe.size.width = width;
self.frame = newframe;
}
}
- (void)setHeight:(CGFloat)height
{
if (height != self.frame.size.height)
{
CGRect newframe = self.frame;
newframe.size.height = height;
self.frame = newframe;
}
}
- (void)setOrigin_x:(CGFloat)origin_x
{
if (origin_x != self.frame.origin.x)
{
CGRect newframe = self.frame;
newframe.origin.x = origin_x;
self.frame = newframe;
}
}
- (void)setOrigin_y:(CGFloat)origin_y
{
if (origin_y != self.frame.origin.y)
{
CGRect newframe = self.frame;
newframe.origin.y = origin_y;
self.frame = newframe;
}
}
#pragma mark 擴展的方法
- (void)moveTo:(CGPoint) point
{
if ((self.center.x != point.x) || (self.center.y != point.y))
{
[UIView animateWithDuration:.3 animations:^{
CGPoint newCenter = self.center;
newCenter.x += point.x;
newCenter.y += point.y;
self.center = newCenter;
}];
}
}
- (void)scaleBy:(CGFloat) scale
{
if (scale >0 && scale != 1)
{
[UIView animateWithDuration:.3 animations:^{
CGRect newframe = self.frame;
newframe.size.width *= scale;
newframe.size.height *= scale;
self.frame = newframe;
}];
}
}
@end
上面對于UIView寫的分類打瘪,添加了成員變量友鼻,而且擴展了UIView類的方法。
最后
參考文檔:http://www.cocoachina.com/ios/20161018/17784.html
這里總結(jié)了一些經(jīng)常用的分類https://github.com/Mexiang/category闺骚,都是簡單經(jīng)常用的方法彩扔,會持續(xù)總結(jié)更新github。