2

次のコードをデバッグ用にビルドできますが、xcode で OS X ターゲット用にリリースすることはできません。

myclass.h:

@interface myclass : NSObject

@property (nonatomic,copy) NSString *name;

@end

myclass.m:

@implementation myclass {
    NSString *_name;
}

@synthesize name = _name;

@end

理由はありますか?iOS では、リリース用とデバッグ用の両方をビルドします。

インスタンス変数の宣言を .h に移動するとうまくいくことは理解していますが、私の意図は実装の詳細を隠すことです (もちろん、実際のクラスはこの例よりも複雑です)。64 ビット アプリをビルドするときに、Mountain Lion の最新の xcode バージョン (4.6、ビルド 4H127) でこれを試しました。

4

3 に答える 3

4

1 つの方法は、クラス拡張を使用することです。.mファイルに次のように記述します。

@interface myclass ()
{
    NSString *_name;
}
@end

あなたの上@implementationmyclass

一方、実際には、プロパティをサポートしているインスタンス変数を宣言する必要はありません。書くだけなら

@property (nonatomic, copy) NSString *name;

クラス宣言 ( で始まり で@interface myclass : NSObject終わるコード@end) で、バッキングNSString *ivar_nameが自動的に生成され、 のインスタンス メソッド内でこの ivar にアクセスできるようになりますmyclass。書く必要すらない@synthesize name = _name;_nameさらに、プロパティをバックアップする以外の変数名を使用する場合nameは、ivar を宣言する必要はありません。代わりに、単に使用できます@synthesize

@synthesize name = m_Name;

クラスの@implementationブロック内。

于 2013-03-15T12:33:31.967 に答える
3

実装ブロックのインスタンス変数には、最新の Objective-C ランタイムが必要です。Objective-C Feature Availability Indexを参照してください。リリースが最新のランタイムをサポートしていない OS X のバージョンをターゲットにしている可能性があります。

于 2013-03-15T12:43:15.463 に答える