簡體   English   中英

在Objective-c中向NIL發送發布

[英]Sending release to NIL in Objective-c

有人可以在Mac電腦上然后在iphone設備上向我解釋該程序的輸出。

我創建了一個瑣碎的Foo類,其中不包含Foo.h:

#import <Foundation/Foundation.h>

@interface Foo : NSObject {

}

@end

和Foo.m:

#import "Foo.h"

@implementation Foo

@end

要在Mac上進行測試,請使用main.m:

#import "Foo.h"

int main(int argc, const char *argv[]) {

  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Foo *myFoo; 

    [myFoo description];
    printf("%p\n", myFoo);
    [myFoo release];

    [pool drain];

    return 0;
}

該程序輸出:

0x0

但是在iPhone上,它直接崩潰了。

謝謝。

您沒有將發布發送到nil變量。 就像在C中一樣

Foo *myFoo; 

創建一個未初始化的堆棧變量,該變量可以包含任何垃圾值。 在Mac上,它的值可能恰巧是0(零),而在iPhone上,它的值恰好是其他值,導致崩潰。

在Objective-C中,當您在nil指針上調用方法時,什么也沒有發生。

但是,在上面的代碼中,您沒有將指針設置為nil,因此您正在向存儲位置發送消息。 如果您的應用程序無權訪問該內存位置,它將崩潰並顯示EXC_BAD_ACCESS消息。

如果崩潰,則應停止添加: Foo *myFoo = nil;

底線是這條線:

Foo *myFoo;

上面沒有創建Foo的實例。 它所做的只是聲明一個變量,如果您創建和初始化這樣的實例,則可以使用該變量來引用它。 要聲明變量創建實例,您需要執行以下操作:

Foo *myFoo = [[Foo alloc] init];

此外,此行:

[myFoo description];

那什么也沒做。 -description方法返回一個字符串,但是您不會將返回的字符串存儲在任何地方,或對其進行任何其他操作。

我可以繼續,但是我不會-對您的建議是前往Apple的網站並閱讀他們的Learning Objective-C教程以及從那里鏈接的其他文章。 這樣做將是學習語言的一種有效方法,而不僅僅是編寫東西並期望編譯器能夠理解它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM