通过self调用类方法

4
我有一个类名很长(确切地说是TimingConfigController)的类中的一些类方法,我经常从该类内部调用这些方法(例如:[TimingConfigController intervalStringAt:i]),但是长类名让我感到困扰,因为这些语句变得非常冗长且难以阅读。

我在阅读相关资料时,发现了这篇developer.apple.com上的文章:定义一个类

其中提到:

id newInstance = [[self alloc] init];

使用self来创建一个与self相同类的对象是一种非常好的方式。据我所知,该语句使用self指针而不是类名调用了一个类方法,因此我在我的应用程序中尝试了这种方法,虽然它可能有效,但会产生编译警告。我真的不想有任何警告。

那么,我的问题是,使用self调用类方法是否可行或是一个好主意?是否有更好的替代方案?我是否可以在.m文件开头使用#define Self TimingConfigController?或者我应该接受这些烦恼并继续下去?

2个回答

6

self仅在类方法内部表示一个类。因为类方法的目标是一个类,所以self代表该类。

例如,在+ (void)initialize方法内部,通常会看到:

+ (void)initialize {
    if (self == [MyClass class]) { // <- self is the current class
        // ...
    }
}

如果你真的想缩短类名而不重命名它,最简单的解决方案是使用 #define 语句:

#define TCC TimingConfigController

// The two lines are equivalent
id result1 = [TimingConfigController theClassMethod]; 
id result1 = [TCC theClassMethod];

1
啊,好的,我没注意到那篇文章里它是一个类方法,并且我甚至不知道这样的方法中有self。非常感谢您指出来。好的,那么定义(define)就是一个可能的解决方案。我会再仔细考虑一下。 - user362178

3

[[self class] alloc] init]只能在类方法中使用,不能在实例方法中使用。如果你有一个实例方法,并且想要创建同一类的对象,则应该使用以下代码:

id newInstance = [[[self class] alloc] init];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接