我想创建一个真正动态的类,它具有块属性。 我想要的是使这个块函数能够访问类实例变量和属性。
这里是我怀疑的代码:
/* 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的实例变量。
答案 0 :(得分: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
可能会被取消分配,但随后会被捕获weakPtr
由Objective-C运行时自动设置为nil
。
答案 1 :(得分:1)
你的块函数应该有一个实例的参数:
@property (nonatomic, assign) void (^updateFunction)(MyClass *obj);
然后调用块:
self.updateFunction(self);
所以你可以:
myClass.variable = @"Variable Value";
myClass.updateFunction = ^(MyClass *obj) {
NSLog(@"%@", obj.variable);
};
[myClass update];
答案 2 :(得分:0)
您的块函数可以在使用属性值的类中调用(私有)方法。