2

私の質問は、1 つのヘッダー (.h) に対しても 1 つの objectclass に対して 2 つの .m ファイルを使用する方法を知っているということです。

私は 20000 行以上の大きなメソッドを持っていますが、このメソッドを .m ファイルで独立させ、他のメソッドを他の .m ファイルで独立させたいと思います。私はそれをしましたが、メソッドが1つの.mファイルにないというエラーが発生します。リンク エラーが発生しますが、2 番目の .m ファイルを削除するとリンク エラーを解消できます。

1 つのヘッダーに対して 2 つの .m ファイルを作成することは可能ですか?

はいの場合、方法を教えてください。

4

3 に答える 3

2

私は20000行以上の大きな方法を持っています

さて、それはあなたの問題です。それはあなたが修正する必要があるものです。物事を2つの実装ファイルに分割することは気を散らすものです。これがあなたの主な問題です。これがひどいやり方ではないという状況は事実上ありません。

メソッドは、最大で数十行の長さにする必要があります。それよりも長いメソッドを作成していることに気付いた場合は、機能を細かく分割する必要があります。ジョブの一部を実行するための小さなメソッドを作成してから、元のメソッドからそれらのメソッドを呼び出します。

クラスはこのサイズであってはなりません。数千行を超えるコードを含むファイルを作成している場合は、1つのクラスが多すぎる機能を担当していることを示す大きな警告サインです。機能をいくつかのクラスに分割する必要があります。各クラスは、機能の1つの重要な部分を担当します。

リンクエラーが発生します

このような文をStackOverflowに投稿すると、実際に発生するエラーが伴うはずです。

于 2012-11-15T21:50:39.973 に答える
1

過度に長いメソッドをクラスのカテゴリにすることができます。

MyClass.h:

@interface MyClass
@property ...
-(void) method;
...
@end

@interface MyClass (BigMethod)
-(void) bigMethod;
@end

MyClass.m:

@implementation MyClass
-(void) method
{
    ...
}
...
@end

BigMethod.m

@implementation MyClass (BigMethod)
-(void) bigMethod
{
    ...
}
@end

ただし、20kライン方式はばかげています。あなたは本当にそれをリファクタリングする必要があります。

于 2012-11-15T21:49:00.167 に答える
0

いくつかのアプローチがあります。

  1. メソッドを 2 つの異なるカテゴリに分けることができます。

    //-- MyClass1.m
    @implementation MyClass (part1)
    
    @end
    
    //-- MyClass2.m
    @implementation MyClass (part2)
    
    @end
    

    対称性の理由から 2 つのカテゴリを定義しました。もちろん、クラスの「ベース」も必要です@implementation(つまり、カテゴリ指定子なし)。extension「ベース」とカテゴリを定義するか、「ベース」と 2 つのカテゴリなどを定義するかを選択できます。

  2. .mまたは、最初のファイルの中に2 番目のファイルを含めることもできます。

        //-- MyClass1.m
        @implementation MyClass
    
        <first part>
    
        #include "MyClass2.m"
    
        @end
    

どちらも機能するはずです。

クラスをリファクタリングする可能性は言うまでもなく、これが最良の選択肢です。

于 2012-11-15T21:46:53.800 に答える