【问题标题】:Why is window autoreleased in appliciation:didFinishLaunchingWithOptions: and released in dealloc?为什么窗口在 application:didFinishLaunchingWithOptions: 中自动释放并在 dealloc 中释放?
【发布时间】:2011-11-27 22:01:08
【问题描述】:

我在 xcode 4.2 中使用没有 ARC 的空模板创建了一个 iphone 应用程序。我目前没有使用 ARC,因为我想学习引用计数的基础知识。在应用程序委托中,我有以下方法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
 }

为什么window 自动释放?是因为 AppDelegate 将来不会使用它吗?但它被分配给一个实例变量。还有一个释放window的dealloc方法。既然已经自动释放了,为什么还要释放?

- (void)dealloc
{
    [_window release];
    [super dealloc];
}

【问题讨论】:

    标签: iphone ios xcode xcode4.2 autorelease


    【解决方案1】:

    .h 文件中window 的属性声明为@property (nonatomic, retain) UIWindow *window;window 有一个 retain 属性。所以UIWindowwindow 变量的setter 方法保留。 在self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 行中,新的window alloced 在retainCount 中有+1,因为alloc 和另一个+1 因为window 设置器方法导致+2 @9876 @。 autorelease 是将retainCount 减少回+1。在 dealloc 中,retainCount 转到 0 并且 window 被释放。

    【讨论】:

    • 谢谢!这就解释了一切。
    • 如果直接赋值(window = ....而不是self.window = ...)就没有必要了吧?
    • 对,因为分配,retainCount 会是 +1。在 dealloc 中会回到 0。
    【解决方案2】:

    每个retainalloccopynew,必须由releaseautorelease 平衡。


    所以在你的代码中:

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    

    allocautorelease 平衡。


    现在对于 dealloc 中的 release,如果您查看 window 属性的定义,您会看到它是一个保留的属性:(在您的 AppDelegate 标头中)

    @property (retain, nonatomic) UIWindow *window;
    

    或更现代的等价物:(在这种情况下,强表示保留)

    @property (strong, nonatomic) UIWindow *window;
    

    这意味着您知道有一个出色的retain,因为@property 和@synthesize 可以阻止您一遍又一遍地编写样板代码。

    所以这必须通过dealloc方法中的release来平衡:

    - (void)dealloc
    {
        [_window release];
        [super dealloc];
    }
    

    【讨论】:

      【解决方案3】:

      window 由属性保留,因此在创建它时不应保留 t (这是 alloc/init 所做的)。它是自动发布的,因为它比发布更容易(发布也可以)。它必须在 dealloc 中释放以对抗属性的保留性质。

      【讨论】:

        猜你喜欢
        • 2011-04-05
        • 2011-01-22
        • 2015-05-29
        • 1970-01-01
        • 2011-03-21
        • 2011-11-09
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多