Iphone 如何访问指向id对象指针的指针?

Iphone 如何访问指向id对象指针的指针?,iphone,objective-c,jailbreak,Iphone,Objective C,Jailbreak,我涉足越狱开发/调整,我已经知道这违反了苹果的SDK权利等。我对objective-c相当陌生,不确定如何访问指向值指针的指针。下面是header函数: - (id)_newCKSMSMessage:(id *)arg1; 我已多次尝试访问arg1的值: id msg = &arg1; id *msg = &arg1; 如何访问arg1指针指向的值?在取消引用指针之前,必须确保它是否为NULL if(NULL != arg1) { id msg = *arg1;

我涉足越狱开发/调整,我已经知道这违反了苹果的SDK权利等。我对objective-c相当陌生,不确定如何访问指向值指针的指针。下面是header函数:

- (id)_newCKSMSMessage:(id *)arg1;
我已多次尝试访问arg1的值:

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

如何访问arg1指针指向的值?

在取消引用指针之前,必须确保它是否为NULL

if(NULL != arg1) {
    id msg = *arg1;
    NSLog(@"msg = %@, [msg class] = %@", msg, NSStringFromClass([msg class]));
}
当您将一个对象传递给_newcksmessage:(id*)arg1时,您可以这样做

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

使用以“\”开头的方法是不合适的。如果你这样做,你可能会与苹果的私有方法发生冲突。

这是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]
。如果使用数组表示法访问值,请确保有正确的边界,否则会出现未定义的行为

难道
不是
操作员的
地址吗

所以
id msg=&arg1
意味着指向
arg1
(第三级!)


你应该做
id msg=*arg1

我想你还有另一个你不知道的问题

此方法的参数很可能不是有效的对象。当您看到指向对象的指针时,几乎总是一个“通过引用返回”参数。调用者传入某个变量的地址,该方法应该将该变量设置为某个对象。例如:

- (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初始化程序中完成。这是一个例外,而不是规则。

@sidyll:这有点尴尬,但实际上没有更好的方法来完成同样的事情,所以我们都必须接受它。这是苹果公司的私有方法之一(从转储的头),我正试着钩住它,理解arg1,然后返回原始函数。我尝试了id msg=*arg1,但是当我尝试记录msg时,我得到了uu NSCFType。我尝试访问&msg,但这会导致崩溃。我很感激你的快速回复,你想了解苹果在那里做什么?也许我们应该备份并讨论您正在尝试做的事情。如果您使用NSLog(@“%@”,msg)登录并获取“u NSCFType”,则它是免费桥接对象之一。我正在尝试拦截传入sms消息的发件人号码,以便我可以弹出回复框,而不必转到MobileSMS.app,然后切换回当前应用程序。这对我来说更像是一个学习过程,让我了解事情是如何运作的。我不需要了解苹果正在做的一切,只需要了解如何将arg1转换为可理解的结构、字典或信息数组。我不确定你说的免费桥接对象(抱歉,还是新的)是什么意思更新了示例代码以反映你可以做的事情,google知道免费桥接对象幸运的是,这导致了一个问题:Tweak.xm:45:警告:不兼容的Objective-C类型返回“objc_class*”,预期为“NSString*”。虽然这应该有效,但我认为@Chuck指出我的问题超出了指针的基础,与苹果调用此方法的方式有关。谢谢你!这是有意义的,特别是对于相同标题中的其他方法,如“addMessage”和“setMessage”。谢谢你,这可能帮我省了几个小时尝试错误的东西!