gpt4 book ai didi

Objective-C - 更改传入对象指针的地址

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:24 25 4
gpt4 key购买 nike

假设我有如下方法:

- (void)reassignPassedObject:(void *)block;

它被称为

NSLog(@"self 1: %@", self);
[myController reassignPassedObject:^(){return self;}];
NSLog(@"self 2: %@", self);

我想将“self”引用重新分配给另一个对象,如下所示:

- (void)reassignPassedObject:(void *)block {
id holder = block();

if ( YES ) {
id newObject = nil; //or NSString or NSArray
//do something such that output second log is "self 2: (newObject...)"
}
}

这可能吗?

这似乎应该是公平的游戏,因为我们只是在谈论重新分配指针。我会担心特定实现中的释放/保留。这里让我感到困惑的挑战是:

  • 它涉及 id 而不是直接指针
  • 它涉及一个 block 传递变量
  • 它涉及到必须以某种方式重新分配 block() 中对象的地址,我们只能访问本地 holder 对象。

想法?

最佳答案

首先,不要在代码中更改self,除非在init... 的开头通过self=[super init.. .]

我不知道你为什么要使用 block ,或者是什么促使你做这一切,但如果你坚持改变指针指向的内容,最标准的基于 C 的方法是将指针传递给多变的。例如

-(void)changeObjectPointedBy:(id*)p{
*p=@"foo";
}

那么这可以用作

NSString*q=@"bar";
[self changeObjectPointedBy:&q];
NSLog(@"%@",q); // prints "foo"

注意代码中多余的&*。在尝试滥用 block 之前,我建议您学习简单的 C。

如果你坚持使用 block ,我会这样做:

-(void)passMyObjToBlock:(void(^)(id))block
{
block(@"foo");
}

可以用作

__block NSString*p=@"bar";
[self passMyObjToBlock:^(id obj){
p=obj;
}];
NSLog(@"%@",p); //prints "foo"

或者,另一种方式是

-(void)reassignPassedObject:(id*(^)())block{
id*holder=block();
*holder=@"foo";
}

然后

id* pointerToSelf=&self;
[foo reassignPassedObject:^(){return pointerToSelf}];
// self is now @"bar"

请注意“指向对象的指针”和“指向对象指针的指针”之间的区别。为了改变 self 指向的内容,您需要将指向 self 的指针传递给函数。这是 C 的一个基本限制,如果不使用一对 &* 就无法做到这一点。

关于Objective-C - 更改传入对象指针的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6906739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com