1

Xcode 4.4.1 を使用しています。@property likeUINavigationControllerまたはNSArrayin .h ファイルを定義するときは @synthesize、.m ファイルで定義する必要があります。しかし、それを機能させるために@property好きなUITabBarControllerNSStringもいれば、必要ない人もい@synthesizeます。

私の質問は、@property必要な@synthesizeものと不要なものです。

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
UITabBarController *_tabBar;
UINavigationController *_navBar;
}

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, retain) Employee *empView;
@property (nonatomic, retain) UITabBarController *_tabBar;
@property (nonatomic, retain) UINavigationController *_navBar;

AppDelegate.m

@implementation AppDelegate
@synthesize _navBar;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
Employee *emp = [[Employee alloc]initWithNibName:@"Employee" bundle:nil];
self._tabBar = [[UITabBarController alloc]init];
self._navBar = [[UINavigationController alloc]initWithRootViewController:emp];
self._tabBar.viewControllers = [NSArray arrayWithObjects:_navBar, nil];
self.window.rootViewController = self._tabBar;
self._navBar.navigationBar.tintColor = [UIColor brownColor];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}

@synthesize UINavigationController私が得たときUINavigationControllerUITabBarController. しかし、私が取得しないとき は@synthesize UINavigationController表示されます。UINavigationControllerUITabBarController

どちらの場合も、私はしませんでした@synthesize UITabBarController

ありがとう

4

1 に答える 1

13

コンパイラ (LLVM) の最後のバージョンが Xcode 4.4 に同梱されたため、@synthesizeディレクティブは不要になりました。

@property明示的に使用しないと宣言するものはすべて@synthesize、書いたかのようにアクセサーが自動的に合成されます@synthesize yourprop = _yourprop;。これは、最新のコンパイラの新機能です (以前と同様に、明示的@synthesizeにすべてを記述する (またはアクセサを実装する) 必要がありました)。@properties

もちろん、必要に応じてプロパティを明示的に使用することもできます@synthesize(昔と同じように)。これは、プロパティに使用するバッキング インスタンス変数を明示的に設計する方法です。しかし、実際のところ、インスタンス変数のことは忘れて(実際、私は宣言の中括弧の間に明示的なインスタンス変数を@interfaceもう使用していません)、宣言のみを使用することを強くお勧めします@property。それと、コンパイラが@synthesizeディレクティブを生成できるようにする新機能により、多くのグルー コードを回避し、クラスをよりコンパクトに記述できます。


参考までに、暗黙的に合成された for がある場合に警告を切り替えることができます@property(つまり、ディレクティブを明示的に記述しなかったため@synthesize、コンパイラが合成します)。プロジェクトの [ビルド設定] に移動し、[暗黙的に合成されたプロパティ] 警告 ([Apple LLVM コンパイラ 4.0 - 警告 - Objective-C] セクションの下) をオンにすると、コンパイラは暗黙的に対象となるすべてのプロパティについて通知します。@synthesizeディレクティブについて自分で言及しなかったため、アクセサーを合成します。

于 2012-09-16T17:35:49.200 に答える