我正在涉及越狱开发/调整,我已经知道这违反了Apple的SDK权限等。我对objective-c相当新,并且不确定如何访问指向值的指针。这是标题函数:
- (id)_newCKSMSMessage:(id *)arg1;
我已尝试多次尝试访问arg1的值:
id msg = &arg1;
id *msg = &arg1;
如何通过arg1访问指向的值?
答案 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