2013-07-19 57 views
0

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

这里的代码与我的疑问:

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

所以从前面的代码我的疑问是:如何从已存储的对象本身的属性块直接访问实例变量的对象。

回答

1

你块功能应该有一个参数实例:

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

然后调用块:

self.updateFunction(self); 

所以你可以在你:

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

是的!这是我正在寻找的。谢谢:) – MatterGoal

+0

快乐服务! –

+0

我不明白为什么捕获'myClass'不应该工作。我可以忽略一些东西吗 –

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

+0

[MyClass的更新]是在一个完全不同的范围内调用。谢谢,我试图用更多的细节来改进我的问题。 – MatterGoal

+0

@MatterGoal:如果从别的地方调用'[myClass update]',我的答案也可以。如果你的意图是应该用“它自己的类指针”来调用该块,那么这是正常的,并且不需要传递'self'。 –