当我在学习类别时。它说新方法被添加到类的所有实例中。即使是类方法也一样吗?我们有可用于所有实例的类方法。那么何时使用类和何时使用类方法?
答案 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的优点在于,即使课程本身不可用,您也可以使用其他实例方法添加类别。