我正在使用Xcode 4.4.1。当我在.h文件中定义@property
UINavigationController
或NSArray
时,我必须在.m文件中@synthesize
。但有一些@property
,例如UITabBarController
或NSString
,我没有@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
时,我得到UINavigationController
和UITabBarController
。但是当我没有@synthesize
UINavigationController
时,我没有得到UINavigationController
,但会显示UITabBarController
。
在这两种情况下,我都没有@synthesize
UITabBarController
由于
答案 0 :(得分:13)
自Xcode 4.4附带的最新版本的编译器(LLVM)以来,不再需要@synthesize
指令。
您声明未明确使用@property
的每个@synthesize
将自动合成其访问者,就像您编写@synthesize yourprop = _yourprop;
一样。这是最新编译器的一个新功能(就像之前必须为所有@synthesize
明确地编写@properties
(或实现访问器)一样。
请注意,如果您愿意,您当然可以明确地使用@synthesize
属性(就像过去一样)。这可以是显式设计用于属性的支持实例变量的方法。但实际上我强烈建议忘记实例变量(事实上,我的@interface
声明的大括号之间不再使用显式实例变量了),仅适用于@property
声明。有了这个以及让编译器为您生成@synthesize
指令的新功能,您将避免使用大量的粘合代码并使您的类更紧凑。
仅当您有@property
隐式合成时,您可以切换警告(意味着您没有明确写出@synthesize
指令,因此编译器现在为你合成它)。只需转到项目的Build Settings并打开“Implicit Synthesized Properties”警告(在“Apple LLVM编译器4.0 - 警告 - Objective-C”部分下),编译器将告诉您隐藏的所有属性合成访问器,因为你自己没有提到@synthesize
指令。