让我们说我有一个方法:
- (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...)"
}
}
这可能吗?
似乎它应该是公平的游戏,因为我们只是在讨论重新分配指针。我会担心在特定实现中发布/保留。让我困惑的挑战是:
想法?
答案 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中所有这些是如何工作的,并且可能会对此有所了解。
您是否正在尝试完成特定的事情?或者你只是希望更好地理解这种语言?