在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,但我之前没有看到过。
在此先感谢您的帮助
Xcode 4.5可以自动合成属性。它通过创建普通的setter/getter来实现,并创建一个带有前缀'_'的ivar。如果你不喜欢,你可以添加自己:
@synthesize foo;
或使用任何你想要的伊娃:
@synthesize foo=MyFoo;
这些问题性质和综合垂直于内存管理。如果你有ARC,并且上述技术正常工作 - 你不需要使用dealloc。但是,如果你不使用arc,那么你应该使用[_foo release]释放dealloc中的对象;
推荐使用self.foo = nil来解释发布的原因是,使用setter将在您的对象正式发布后生成KVO通知。
只是要清楚。在我的代码中,我没有使用ARC,但它仍然创建以'_'为前缀的ivar,所以我应该在'viewDidUnload'中将该属性设置为nil并将其释放到'dealloc'中,或者其中一个足够了? –
好吧,无论值多少钱,如果我使用'@ synthesize'directive,我会在dealloc方法中出错。所以就是这样,谢谢你的回应。 –
如果你不使用ARC,那么提供一个调用super的dealloc。如果你使用@ synthesize,那么'[foo release]'。如果你不使用@ synthesize,你的ivar被命名为'_foo',所以使用[_foo release];' –
使用iOS(5或以上)sdk?我认为xcode会为我们自动执行此操作,并且此功能是在iOS 5中引入的。 – kidsid49
@synthesise行是使用XCode 4.5自动生成的属性 – CarlJ
是的,示例使用的是iOS 5.0 SDK,但我们假设我想要定位iOS 4.3 ,即使我没有申报伊娃,我是否也应该发布伊娃? –