2011-07-12 222 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