1

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

这是我怀疑的代码:

/* 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? 
}

因此,从前面的代码中,我的疑问是:如何直接从已存储为 Object 本身属性的块中访问 Object 的实例变量。

4

3 回答 3

1

您的块函数应该有一个实例的参数:

@property (nonatomic, assign) void (^updateFunction)(MyClass *obj);

然后调用块:

self.updateFunction(self);

所以你可以:

myClass.variable = @"Variable Value";
myClass.updateFunction = ^(MyClass *obj) {
   NSLog(@"%@", obj.variable);
};
[myClass update];
于 2013-07-19T16:54:21.247 回答
1

您可以 毫无问题地访问块中的实例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可能会被释放,但随后捕获的对象会由 Objective-C 运行时weakPtr 自动设置为。nil

于 2013-07-19T16:33:25.597 回答
0

您的块函数可以调用使用属性值的类中的(私有)方法。

于 2013-07-19T16:22:01.227 回答