Objective c 块作为属性和访问类实例变量

Objective c 块作为属性和访问类实例变量,objective-c,Objective C,我想创建一个真正动态的类,它的属性是块。 我想要的是使这个块函数能够访问类实例变量和属性 下面是我怀疑的代码: /* MyClass Interface */ @interface MyClass:NSObject @property (nonatomic, strong) NSString *variable; @property (nonatomic, assign) void (^updateFunction)(); @end /* MyClass implementation */

我想创建一个真正动态的类,它的属性是块。 我想要的是使这个块函数能够访问类实例变量和属性

下面是我怀疑的代码:

/* MyClass Interface */
@interface MyClass:NSObject
@property (nonatomic, strong) NSString *variable;
@property (nonatomic, assign) void (^updateFunction)();
@end


 /* MyClass implementation */
@implementation MyClass

-(void)update{ 
    //Perform the block function code
    self.updateFunction();
}
@end



/* MyClass usage*/
MyClass *myClass = [[MyClass alloc]init];
myClass.variable = @"Variable Value";
myClass.updateFunction = ^{ 
   //HERE MY DOUBT...
   //How can I access the myClass.variable and be sure that when this block
   //will be called it didn't get a bad access? 
}

因此,从前面的代码来看,我的疑问是:如何直接从作为对象本身属性存储的块访问对象的实例变量。您的块函数可以调用(private)方法。您只需访问实例
myClass
及其属性
myClass.variable
在没有问题的区块中:

myClass.variable = @"Variable Value";
myClass.updateFunction = ^{
    NSLog(@"%@", myClass.variable);
};
[myClass update];
块“捕获”实例变量的值,并创建强 引用,以便对象不会被解除分配

但请注意,这会创建一个“保留周期”,因此
myClass
永远不会被释放。 因此,您必须在某个点释放块以打破保留循环:

myClass.updateFunction = nil;
或者使用弱引用:

__weak MyClass *weakPtr = myClass;
myClass.updateFunction = ^{
    MyClass *strongPtr = weakPtr;
    if (strongPtr) {
        NSLog(@"%@", strongPtr.variable);
    }
};
在第二种情况下,
myClass
可能会被释放,但随后捕获的
weakPtr

由Objective-C运行时自动设置为
nil

块函数应具有实例的参数:

@property (nonatomic, assign) void (^updateFunction)(MyClass *obj);
然后调用块:

self.updateFunction(self);
因此,你可以:

myClass.variable = @"Variable Value";
myClass.updateFunction = ^(MyClass *obj) {
   NSLog(@"%@", obj.variable);
};
[myClass update];

[MyClass update]是在一个完全不同的范围内调用的。对不起,我试图用更多细节来改进我的问题。@MatterGoal:如果从其他地方调用了
[MyClass update]
,我的答案也有效。如果您的意图是使用“它自己的类指针”调用块,那么这就行了,不需要传递
self
。是的!这就是我要找的。谢谢:)我不明白为什么捕获
myClass
不起作用。我是否忽略了什么?要允许属性声明,您需要在@interface之前使用
@class MyClass