1

我正在使用 Xcode 4.4.1。当我定义 @property 喜欢UINavigationControllerNSArray在 .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我得到UINavigationControllerand时UITabBarController。但是当我不这样 做时,我@synthesize UINavigationController不会得到UINavigationControllerUITabBarController会显示。

在这两种情况下我都没有@synthesize UITabBarController

谢谢

4

1 回答 1

13

由于 Xcode 4.4 附带了最新版本的编译器 (LLVM),因此@synthesize不再需要该指令。

@property您声明的每个未@synthesize明确使用的访问器都将自动合成其访问器,就像您编写@synthesize yourprop = _yourprop;. 这是最新编译器的一个新功能(就像在您必须@synthesize为所有显式编写(或实现访问器)之前一样@properties)。

请注意,当然,@synthesize如果您愿意(就像过去一样),您仍然可以显式使用该属性。这可以是一种显式设计用于属性的支持实例变量的方法。但事实上,我强烈建议忘记实例变量(事实上,我不再在@interface声明的大括号之间使用显式实例变量了),而只使用@property声明。有了它和让编译器@synthesize为您生成指令的新功能,您将避免大量胶水代码,并使您的类更易于编写。


仅供参考,当您有一个隐式合成的 for 时,您可以切换警告@property(这意味着您没有@synthesize明确编写指令,因此编译器现在为您合成它)。只需转到项目的 Build Settings 并打开“Implicit Synthesized Properties”警告(在“Apple LLVM compiler 4.0 - Warnings - Objective-C”部分下),编译器就会告诉你它隐含的所有属性合成访问器,因为您自己没有提及该@synthesize指令。

于 2012-09-16T17:35:49.200 回答