[英]How do you access a pointer to a pointer for an id object?
我正在涉足越狱开发/调整,我已经知道这违反了 Apple 的 SDK 权利等。我对 objective-c 相当陌生,并且不确定如何访问指向值的指针的指针。 这是 header function:
- (id)_newCKSMSMessage:(id *)arg1;
我尝试了几次尝试来访问 arg1 的值:
id msg = &arg1;
id *msg = &arg1;
如何访问 arg1 指向的值?
我认为你还有另一个你不知道的问题。
此方法的参数很可能不是有效的 object 。 当您看到指向 object 的指针的指针时,这几乎总是一个“按引用返回”参数。 调用者传入某个变量的地址,该方法应该将该变量设置为某个object。 例如:
- (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 object AFAIK 的指针。
编辑:好的,我只是想到了另一个原因:如果您要传递一个 C 对象数组。 但这不太常见。 它几乎只在几个 NSArray 初始化程序中完成。 这更像是例外而不是规则。
在取消引用指针之前,您必须确保检查它是否为 NULL;
if(NULL != arg1) {
id msg = *arg1;
NSLog(@"msg = %@, [msg class] = %@", msg, NSStringFromClass([msg class]));
}
当您将 object 传递给 _newCKSMSMessage:(id*)arg1 时,您会这样做;
id gak = [[Gak alloc] initWithInterestingStuff:interestingStuff];
[something _newCKSMSMessage:&gak];
使用以“_”开头的方法是不合适的。 如果这样做,您可能会与 Apple 的私有方法发生冲突。
这是 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 时,您可以使用(**vPtr)
或*vPtr[k]
来表示一些 k 或vPtr[j][k]
来表示一些j,k
。 如果使用数组表示法访问该值,请确保具有正确的界限,否则您将获得未定义的行为。
&
不是运算符的address of
吗?
所以id msg = &arg1
意味着指向arg1
的指针(第三级!)
你应该做id msg = *arg1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.