在Apple文档中发布ivars并将属性设置为零

问题描述:

我一直使用@synthesize以及在.h文件中声明的类属性。我遇到了一些苹果文档found here中的PhotoPicker示例,并发现了一个非常令人困惑的声明。在他们的AppDelegate类(h文件),他们不创造任何实例变量,只是性质,是这样的:在Apple文档中发布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指令,或任何实例变量,但是如果我看dealloc方法,他们释放出一些“看不见”的高德(什么???)

- (void)dealloc 
{ 
    [_navController release]; 
    [_window release]; 

    [super dealloc]; 
} 

而在CL的viewController他们在viewDidUnload中将属性设置为零,并在dealloc方法中释放(未创建的)“ivars”。

这是否与一些新的Xcode的事情?有人可以对此有所了解吗?我正在检查didReceiveMemoryWarning上的逻辑,并且始终将属性设置为viewDidUnload中的零,并释放了dealloc中的ivars,但我之前没有看到过。

在此先感谢您的帮助

+0

使用iOS(5或以上)sdk?我认为xcode会为我们自动执行此操作,并且此功能是在iOS 5中引入的。 – kidsid49

+0

@synthesise行是使用XCode 4.5自动生成的属性 – CarlJ

+0

是的,示例使用的是iOS 5.0 SDK,但我们假设我想要定位iOS 4.3 ,即使我没有申报伊娃,我是否也应该发布伊娃? –

Xcode 4.5可以自动合成属性。它通过创建普通的setter/getter来实现,并创建一个带有前缀'_'的ivar。如果你不喜欢,你可以添加自己:

@synthesize foo; 

或使用任何你想要的伊娃:

@synthesize foo=MyFoo; 

这些问题性质和综合垂直于内存管理。如果你有ARC,并且上述技术正常工作 - 你不需要使用dealloc。但是,如果你不使用arc,那么你应该使用[_foo release]释放dealloc中的对象;

推荐使用self.foo = nil来解释发布的原因是,使用setter将在您的对象正式发布后生成KVO通知。

+0

只是要清楚。在我的代码中,我没有使用ARC,但它仍然创建以'_'为前缀的ivar,所以我应该在'viewDidUnload'中将该属性设置为nil并将其释放到'dealloc'中,或者其中一个足够了? –

+0

好吧,无论值多少钱,如果我使用'@ synthesize'directive,我会在dealloc方法中出错。所以就是这样,谢谢你的回应。 –

+1

如果你不使用ARC,那么提供一个调用super的dealloc。如果你使用@ synthesize,那么'[foo release]'。如果你不使用@ synthesize,你的ivar被命名为'_foo',所以使用[_foo release];' –