繁体   English   中英

如何访问指向 id object 的指针的指针?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM