2013-07-19 56 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'。 –