0

我一直使用@synthesize.h 文件中声明的类属性。我在此处找到的一些 Apple 文档中遇到了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 的方法(什么???)

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

    [super dealloc];
}

在 viewController 类中,他们将属性设置为 nilviewDidUnload并在方法中释放(非创建的)“ivars” dealloc

这是否与一些新的 Xcode 事物有关?有人可以对此有所了解吗?我正在检查我的逻辑,didReceiveMemoryWarning并且总是将属性设置为 nilviewDidUnload并释放 ivars,dealloc但我以前从未见过。

提前感谢您的帮助

4

1 回答 1

0

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

@synthesize foo;

或使用您想要的任何 ivar:

@synthesize foo=MyFoo;

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

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

于 2012-10-19T11:32:55.897 回答