我一直使用@synthesize
和.h文件中声明的类属性。我在一些Apple文档found here 中遇到了 PhotoPicker 示例,发现了一个非常令人困惑的声明。在他们的AppDelegate类(.h文件)中,他们不会创建任何ivars,只是属性,如下所示:
#import <UIKit/UIKit.h>
@interface AppDelegate : NSObject <UIApplicationDelegate>
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end
在他们的Appdelegate.m文件中,他们写了这个:
#import "AppDelegate.h"
@interface AppDelegate ()
@property (nonatomic, retain) IBOutlet UINavigationController *navController;
@end
@implementation AppDelegate;
现在,我没有找到任何@synthesize
指令或任何ivars,但是如果我查看dealloc
方法,他们会释放一些“看不见的”ivars(What ???)
- (void)dealloc
{
[_navController release];
[_window release];
[super dealloc];
}
在viewController类中,他们在viewDidUnload
中将属性设置为nil,并在dealloc
方法中释放(非创建的)“ivars”。
这与一些新的Xcode有关吗?有人可以对此有所了解吗?我在didReceiveMemoryWarning
检查我的逻辑,并始终在viewDidUnload
中将属性设置为nil并在dealloc
中释放ivars但我之前没有看到过。
提前感谢您提供任何帮助
答案 0 :(得分:0)
Xcode 4.5可以自动合成属性。它通过创建普通的setter / getter来实现,并且还创建了一个带有前置'_'的ivar。如果您不喜欢,可以添加自己的:
@synthesize foo;
或使用你想要的任何ivar:
@synthesize foo=MyFoo;
这些属性和合成问题与内存管理正交。如果您有ARC,并且上述技术正常工作 - 您不需要使用dealloc。但是,如果你不使用arc,那么你应该使用[_foo release]释放dealloc中的对象;
建议原因是self.foo = nil,使用setter会在对象正式发布后生成KVO通知。