0

2つの方法で.mから別の.mへのグローバル変数の値を取得しようとしました:

まず、viewController.mクラスを別の.mクラスにインポートして値を取得しようとしましたが、リンカーエラーが発生しました。

次に、文字列名を使用してexternを作成したところ、完全に機能し始めました。

私の質問は、インポートでエラーが発生した理由と、extern変数がその特定のクラスの文字列名をどのように認識するかです。
(つまり、異なるクラスに同じ名前の変数が2つまたは3つあり、externと文字列名を入力すると、クラスをインポートしていないため、どの値が取得されますか?)

そして、アドオンの質問:クラスを実際にインポートするのはいつですか?

4

3 に答える 3

1

クラスのプロパティとメソッドにアクセスする必要がある場合は、実際にクラスをインポートします。それはあまりにも明白に聞こえたかもしれませんが、それはそれが実際に何であるかです。クラスは、OOPのカプセル化の概念を擬人化したものです。

あるポイントから別のポイントへの変数の取得は、さまざまな方法で実行できます。userdefaults機能を使用したり、アプリデリゲート内に変数を配置してからさまざまなクラスの値にアクセスしたり、宛先のビューコントローラーでプロパティを公開したりできます。いくつか例を挙げると、宛先に移行する前に、ソースビューコントローラにそのプロパティを設定してもらいます。シナリオに応じて正しい方法と間違った方法は他にもたくさんあります。

ビューコントローラAを別のビューコントローラBにインポートすることは、単にAの値にアクセスすることはやり過ぎのように思えます(インポートメカニズムの不適切な使用を完全に排除しない場合)。

この質問はexternsをさらに説明します、私はそれらにさらされていません、

Objective-Cの静的変数、外部変数、パブリック変数

お役に立てれば。

于 2013-01-13T03:56:47.067 に答える
0

私はこれがすでに詳細に答えられていることを知っています、しかし私はただいくつかの説明を提供したいと思います。

プライベートにしておきたいデータを.mファイルで宣言します。他のオブジェクトにアクセスできるようにするデータについては、ヘッダー.hファイルで宣言します。すべての宣言にプロパティを使用します。

  //myViewController.h
  @interface myViewController: UIViewController

  @property (assign) int myInt;
  @property (strong) NSString* someString;

  @end

myViewControllerにメッセージを渡すことにより、別のオブジェクトからこれらのプロパティにアクセスできます。

  [myViewController setMyInt:20];    //setter
  [myViewController someString];    //getter

または、同等のドット表記を使用できます

  myViewController.myInt = 20;
  myViewController.someString;

#include "myViewController.h"これらにアクセスしたいオブジェクトで行う必要があります)

myViewController内では、「self」を使用してそれらにアクセスします。

  self.myInt;
  self.someString;

これは、セッター/ゲッターを介した仲介アクセスです。バッキング変数には、myViewController内から直接アクセスできます(他のオブジェクトからはアクセスできません_myInt_someString。これは、initおよびdeallocメソッド以外ではお勧めできません。

プロパティは、インスタンス変数の宣言とデフォルトのゲッターとセッターの作成をカプセル化するため、個別の変数宣言を行う必要はなく、デフォルトの動作を変更する必要がある場合にのみ、独自のアクセサーを作成する必要があります。

ここで私の答えも参照してください:
インターフェイスで変数を宣言する必要がありますか、Objective-Cアークでプロパティを使用する必要がありますか?

于 2013-01-13T11:48:00.990 に答える
0

まず、viewController.mクラスを別の.mクラスにインポートして値を取得しようとしましたが、リンカーエラーが発生しました。

.m(実装)ファイルをインポートしないでください。.h(ヘッダー)ファイルのみをインポートします。

私の質問は、インポートでエラーが発生した理由です

Cではstatic、特定の名前を持つ(非)グローバル関数または変数は1回だけ定義する必要があるという規則があります。変数の場合、そのタイプと名前を書き込むとそれが定義されます。関数の場合、実装はそれを定義します。したがって、2つの異なるコードファイルに同じ名前のグローバル関数または変数を含めると失敗します。彼らは衝突します。

ファイルをインポートするということは、ファイルのソース全体を取得してそこに挿入することを意味します。AmをBmに「インポート」すると、Amのソース全体がBmに挿入されます。つまり、Amのすべての宣言がプログラムの2つのコードファイル(AmとBm)に表示されるため、エラーが発生します。

グローバル変数または関数を複数回宣言できます(ただし、定義はできません)。externを定義せずにを使用して変数を宣言できます。で宣言するとextern、同じコードファイルで実際に宣言されていなくても、変数を使用できます。

そして、extern変数はその特定のクラスからの文字列名をどのように認識しますか?(つまり、異なるクラスに同じ名前の変数が2つまたは3つあり、externと文字列名を入力すると、クラスをインポートしていないため、どの値が取得されますか?)

上で説明したように、プログラムには、指定された名前を持つ非グローバル変数を1つだけ含めることができます。static同じ名前の変数が異なるファイルにあるとエラーになります。非staticグローバル変数および関数は、その名前によって、プログラムの他の部分からアクセスできる可能性があります(そしてそれはリンクの魔法を通して機能します)。


一般に、多くのファイルで使用されるグローバル変数のベストプラクティスは、(実行しているように).mファイルで定義し、externその.mファイルに対応する.hファイルで宣言することです。次に、そのヘッダーをインポートする他のファイルが自動的にその変数にアクセスできるようになります。

于 2013-01-13T08:02:38.573 に答える