类别和类方法有什么区别?

时间:2015-12-15 21:57:05

标签: objective-c methods static categories

当我在学习类别时。它说新方法被添加到类的所有实例中。即使是类方法也一样吗?我们有可用于所有实例的类方法。那么何时使用类和何时使用类方法?

2 个答案:

答案 0 :(得分:2)

好的,让我们看一个例子。假设您使用NSArray作为数据的主要集合对象。所以这意味着大部分时间,您的数据都在NSArray中传递。

NSArray *myArray = @[@"obj1",@"obj2",@"obj3"];

同时,假设您在应用程序中对数据集执行某些操作。对于此示例,我们假设您要随机化阵列中的所有数据。你怎么能做到这一点?

选项1(自定义子类 - 实例方法):编写一个充当“帮助器”的类,使用实例方法对数据集执行常见操作。 / p>

Ex)MyDataHelper Class

@interface MyDataHelperClass : NSObject
{
-initWithData(NSArray*)array;
-(NSArray*)randomizeData
-(NSArray*)sortData
...
}

虽然这样的事情没有任何死亡错误,但看起来你必须经历的额外工作会被复制到各处。您需要初始化辅助类,然后调用实例方法来操作数据。

Ex)

// Init your helper
MyDataHelper *helper = [[MyDataHelper alloc]] initWithData:myArray];
// Call your helper methods
NSArray *randomArray = [helper sortData] 

选项2(自定义子类 - 类方法):编写一个充当“助手”的类,使用 CLASS METHODS 在数据集上实现常用操作。< / p>

@interface MyDataHelperClass : NSObject
{

+(NSArray*)randomizeData:(NSArray*)data
+(NSArray*)sortData:(NSArray*)data
...
}

类方法是可以从类中调用而无需实例化类的方法。大部分时间它们都用于为您经常打电话等操作提供便利......

Ex)

NSArray *randomArray = [MyDataHelper randomizeData:myArray];

请注意使用情况如何更简化,但是有更好的方法吗?

选项3 :(类别 - 实例+类方法)使用类别将实例方法或类别方法添加到现有类。

类别就像是将类和实例方法添加到任何现有类的方法。执行此操作时,如果导入类别,则可以从扩展类中调用添加的方法。

在此示例中,我们的数据集是NSArray。如果我们添加一个名为DataHelper + NSArray的类,我们可以直接在NSArray对象上添加我们的辅助方法。

Ex)

@interface NSArray (DataHelper)

- (NSArray)sortData;
- (NSArray)randomizeData;

@end 

@implementation NSArray (DataHelper)
- (NSArray)sortData
{
...// Calling self, is the NSArray instance (myArray)
}
- (NSArray)randomizeData
{
...// calling self, is the NSArray instance (myArray)
}

@end

注意现在的用法更有意义。

<强>例)

NSArray *sortedData = [myArray sortData];

答案 1 :(得分:-1)

类别和类方法是完全不同的东西。你读过的那句话,你完全误解了。类方法未添加到类的任何实例中。实例方法被添加到类的实例中,类方法被添加到类本身。

类别添加了类定义本身不可用的其他实例方法。 Objective-C的优点在于,即使课程本身不可用,您也可以使用其他实例方法添加类别。