Прежде всего, не изменяйте self
внутри вашего кода, если только в начале init...
через self=[super init...]
.
И я понятия не имею, почему вы хотите использовать блоки или что побуждает вас делать все это, но если вы настаиваете на изменении того, на что указывает указатель, самый стандартный способ на основе C - это передать указатель на переменная. например,
-(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, и вы не можете сделать это без использования одной пары &
и *
.
.