阻止作为属性并访问类实例变量

时间:2013-07-19 16:16:33

标签: objective-c

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

这里是我怀疑的代码:

/* 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的实例变量。

3 个答案:

答案 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)

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