2010-08-04 25 views
1

我想知道在調用函數之前,如果客觀C做了任何檢查以查看指向對象的指針是否爲零。將零對象傳遞給一個函數

例如,說我有一個

myObject* ptr; 

和初始化

ptr = nil; 

,並呼籲

[self myFunction:ptr]; 

其中myFunction是我自己的函數並不做任何檢查,看是否對象是零。我聽說某個地方,目標C不會調用該函數,如果它是零?這是真的,我的代碼會安全嗎?

我問的原因是因爲我正在實施一個通用應用程序,並有一個UIView實例只能用於ipad。但是,我爲這個視圖做了很多的函數調用,而不是在調用函數之前進行條件檢查以查看它是否是ipad,如果我可以將視圖設置爲nil(如果它是iphone),那將是非常好的。另外,如果接口生成器分配了對象並將指針設置爲零,是否會出現內存泄漏或者生成器是否知道要釋放該對象?

感謝

回答

6

你總是可以提供一個nil參數的方法,但我想你可能會誤解是什麼有關信息nil

MyClass *object = nil; 
[object doSomething]; // nothing done, because object is nil 

object = [[MyClass alloc] init]; 
[object doSomething]; // does something, because object points to an instance 

爲了證明提供nil作爲參數:

NSMutableDictionary *myDict = [NSMutableDictionary dictionary]; 
[myDict setObject:@"Value 1" forKey:@"Key 1"]; 
[myDict setObject:nil forKey:@"Key 1"]; // perfectly valid 
// myDict is empty again after setting nil value for "Key 1". 

myDict = nil; 
[myDict setObject:@"Value 1" forKey:@"Key 1"]; // nothing happens! 

在上述情況下,objectmyDict被稱爲「 」接收機。當接收者是nil時,不執行任何操作。這比其他的編程語言完全不同的,例如,在C++以下是無效的:

MyClass *object = NULL; 
object->doSomething(); // oops, this is not allowed 
+2

是的,對原始海報要更加清楚:你的理解是倒退的。如果**對象**是'nil',則什麼都不會發生。如果**參數**爲零,則該方法仍然被調用,並且如預期的那樣處理零,或者爆炸。爭論沒有魔法。 – 2010-08-04 23:37:44

+0

感謝您的回答,夥計們。是的,這回答了我的問題。對不起,我來自程序編程,並沒有太多的OOP經驗,所以我習慣於傳遞參數並忘記接收器的概念。是的,我的大部分代碼都在 [myObject myFunction]格式,所以我應該能夠將myObject設置爲nil。如果系統現在通過我的物體,我只是擔心。 – user396004 2010-08-05 00:16:57

+0

如果你意識到除了明確通過的參數之外,self和_cmd都可以作爲隱式參數存在於每個方法中,這可能會有所幫助。當你的方法被調用時,'self'(接收者)只是一個隱含的參數。 – NSResponder 2010-08-05 02:47:47

0

至於內存,如果你在NIB文件的對象,然後將其出口到零的代碼,會有內存泄漏。您應該釋放該對象,然後將其設置爲零。

但是,在這種情況下,如果是iPad,只需創建對象,如果它是iPhone,則將該變量保留爲零即可。這樣,如果您在NIB文件中創建對象,則無需處理任何可能會出現的雜散引用。這可能是也可能不是問題,但可能有條件創建而不是有條件地銷燬。

+0

嗯,這是一個好主意。我將不得不考慮它,但我是iphone編程的新手,界面構建器對我來說絕對是一個柺杖,因爲手動編程維度可能對所有設置都很乏味,尤其是諸如分段控件和按鈕之類的控件。另外,我構建的代碼主要使用nib文件。 儘管感謝內存泄漏問題! – user396004 2010-08-05 00:18:37

+0

快速的問題,界面生成器不會試圖在視圖完成後釋放我的對象嗎?它是否使用release或dealloc,因爲如果它在我釋放之後試圖釋放它,我將會出現錯誤錯誤,對嗎? – user396004 2010-08-05 00:19:58

+0

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html – 2010-08-05 03:03:54