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

时间:2011-08-02 02:44:38

标签: objective-c c pointers

让我们说我有一个方法:

- (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()中对象的地址,我们有权访问的是本地持有者对象。

想法?

2 个答案:

答案 0 :(得分:3)

首先,除非在self开头init...,否则请勿在代码中更改self=[super init...]

我不知道你为什么要使用块,或者是什么促使你做这一切,但如果你坚持改变指针指向的东西,那么最标准的基于C的方法是将指针传递给变量。 e.g。

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

然后这可以用作

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

请注意代码中的额外&*。在尝试滥用块之前,我建议你学习直截了当的C.

如果你坚持使用一个块,我会这样做:

-(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的基本限制,如果不使用一对&*,就无法做到这一点。

答案 1 :(得分:1)

虽然您可以指定自己(通常在init方法中这样做),但您所做的事情似乎非常非常错误。

A great post on Cocoa With Love描述了Objective-C中所有这些是如何工作的,并且可能会对此有所了解。

您是否正在尝试完成特定的事情?或者你只是希望更好地理解这种语言?