2011-07-12 187 views
2

我涉足越獄開發/調整,我已經知道這是違反蘋果的SDK權利等。我對objective-c相當陌生,並且不確定如何訪問指向值的指針。這裏是頭功能:如何訪問指向id對象的指針的指針?

- (id)_newCKSMSMessage:(id *)arg1; 

我已經試過多次嘗試獲取訪問Arg1的值:

id msg = &arg1; 
id *msg = &arg1; 

如何通過ARG1訪問值是指針?

+1

'id *'傷了眼睛 – sidyll

+1

@sidyll:有點尷尬,但沒有什麼更好的辦法可以完成同樣的事情,所以我們都必須吮吸它。 – Chuck

回答

3

我覺得你有另外一個問題,你不知道你有。

該方法的參數極有可能是而非有效對象。當你看到一個指向對象的指針時,這幾乎總是一個「通過引用返回」參數。調用者傳入一些變量的地址,並且該方法應該將該變量設置爲某個對象。例如:

- (void)tellMeHello:(id *)message { 
    if (message) { 
     *message = @"Hello!"; 
    } 
} 

// It's used like this: 

id thisWillBeTheMessage; // it's nothing right now 
[someObject tellMeHello:&thisWillBeTheMessage]; 
NSLog(@"%@", thisWillBeTheMessage); // prints "HELLO!" 

我不熟悉這裏討論的方法,但有相當多沒有其他原因,將指針傳遞到一個指向Objective-C的對象AFAIK。

編輯:好的,我只是想到另一個原因:如果你傳遞一個C數組的對象。但那是不常見的。這幾乎只能在幾個NSArray初始化器中完成。這比規則更例外。

+0

這是有道理的,特別是與同名頭文件中的其他方法,如「addMessage」和「setMessage」。謝謝你,這可能爲我節省了幾個小時嘗試錯誤的東西! –

2

在取消引用指針之前,必須確保它是否爲NULL;

if(NULL != arg1) { 
    id msg = *arg1; 
    NSLog(@"msg = %@, [msg class] = %@", msg, NSStringFromClass([msg class])); 
} 

當你傳遞一個對象來_newCKSMSMessage:(ID *)ARG1你是這樣做的;

id gak = [[Gak alloc] initWithInterestingStuff:interestingStuff]; 
[something _newCKSMSMessage:&gak]; 

以'_'開始的方法是不正確的。如果你這樣做,你很可能會與蘋果的私人方法發生衝突。

+0

這是Apple的私有方法之一(來自傾倒標題),並且我試圖掛鉤它,理解arg1,然後返回原始函數。我已經嘗試過id msg = * arg1,但是當我嘗試記錄msg時,我得到__NSCFType。我試着訪問&味精,但這會導致崩潰。我很欣賞這個快速回復 –

+1

你在試圖理解蘋果在那裏做什麼?也許我們應該備份並討論你想要做的事情。如果您使用NSLog(@「%@」,msg)進行日誌記錄,並獲取'__NSCFType',則可以使用其免費橋接對象之一。 –

+0

我想攔截髮件人的號碼到一個傳入的短消息,以便我可以彈出一個回覆框,而不必去MobileSMS.app,然後切換回我當前的應用程序。這對我來說是一個學習過程,更多的是學習如何運作。我不一定需要了解蘋果公司正在做的所有事情,只需要將arg1變成可理解的結構,字典或信息數組。我不確定您的免費橋接對象是什麼意思(對不起,仍然是新的) –

2

這是根本C.下面是一個例子:

int val = 5; 
int* valPtr = &val;  //valPtr points to val; 
int** valPtrPtr = &valPtr; //valPtrPtr is a pointer to a pointer to val 
int newVal = **valPtrPtr; //newVal = 5 

比方說,你有一個指向名爲vPtr指針。無論何時您想要取消參考vPtr,對於某些k,您都使用(**vPtr)*vPtr[k],對於某些j,k則使用vPtr[j][k]。如果使用數組表示法訪問該值,請確保有正確的邊界,否則會出現未定義的行爲。

+0

儘管這應該起作用,我認爲@Chuck指出我的問題超出了指針的基礎知識,並且與蘋果的方式有關正在調用這個方法。謝謝你! –

0

是不是& a address of運算符?

所以id msg = &arg1將意味着指針arg1(第三級!)

你應該做id msg = *arg1