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

时间:2011-07-12 19:02:18

标签: iphone objective-c jailbreak

我正在涉及越狱开发/调整,我已经知道这违反了Apple的SDK权限等。我对objective-c相当新,并且不确定如何访问指向值的指针。这是标题函数:

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

我已尝试多次尝试访问arg1的值:

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

如何通过arg1访问指向的值?

4 个答案:

答案 0 :(得分: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初始化器中完成。这比规则更为例外。

答案 1 :(得分: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];

使用以'_'开头的方法是不合适的。如果你这样做,你可能会与Apple的私人方法发生冲突。

答案 2 :(得分: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],对某些vPtr[j][k]使用j,k。如果使用数组表示法访问该值,请确保具有正确的边界,否则您将获得未定义的行为。

答案 3 :(得分:0)

&address of运营商吗?

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

你应该id msg = *arg1