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

时间:2012-10-19 10:33:32

标签: ios

我一直使用@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但我之前没有看到过。

提前感谢您提供任何帮助

1 个答案:

答案 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通知。