[英]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.