2014-01-15 53 views
0

我的一般問題是如何以及如何測試以查看任意對象是否支持給定屬性。對於方法來說,這很簡單。我會發送一個respondsToSelector:消息給對象並檢查結果。我找不到類似的屬性機制。測試屬性是否存在(即numberOfValidItemsForDrop)

我的具體問題是我正在寫一個自定義的NSView,支持將圖像文件(複數)放到它上面。我在10.9上構建,並在10.6上部署。對於運行10.7及更高版本的機器,我想利用enumerateDraggingItemsWithOptions:...方法和numberOfValidItemsForDrop屬性在拖動圖像(編號和可接受的文件)中提供的用戶反饋。

我最初的想法如下。測試提供給draggingEntered:方法的發件人(聲明爲ID < NSDraggingInfo>)。如果是這樣,請使用10.7中提供的機制。如果不是,請回到之前的機制。

if([sender respondsToSelector:@selector(enumerateDraggingItemsWithOptions:forView:classes:searchOptions:usingBlock:) ]) 
{ 
    __block NSInteger n=0; 
    [sender enumerateDraggingItemsWithOptions:NSDraggingItemEnumerationClearNonenumeratedImages 
            forView:self 
            classes:types 
           searchOptions:options 
           usingBlock:^(NSDraggingItem *draggingItem, NSInteger idx, BOOL *stop) { ++n; } ]; 
    self.numberOfValidItemsForDrop = n; 
    rval = (n>0 ? NSDragOperationCopy : NSDragOperationNone); 
} 
else 
{ 
    NSArray *itemsInDrag = [[sender draggingPasteboard] readObjectsForClasses:types options:options]; 
    rval = [itemsInDrag count]>0 ? NSDragOperationCopy : NSDragOperationNone); 
} 

我關心的是分配給numberOfValidItemsForDrop是否會導致10.6環境問題。我把一個快速測試放在一起,在這個測試中,我將其分配給if(0)條件內的假屬性,並且編譯器窒息。

if(0) 
{ 
    sender.bogus=1; 
} 

這與開發環境中的屬性無效是不一樣的。但是,我擔心numberOfValidItemsForDrop的賦值在10.6的運行時也可能有問題,即使它實際上不應該被執行。

我已經把一個小的虛擬應用程序扔到了一起,這個應用程序已經發送給我的測試人員,但還沒有聽到,並且想繼續在這個項目上繼續前進。

感謝您的任何/所有信息。

回答

2

您可以使用Objective-C運行時函數class_getProperty來測試命名屬性的存在:

if(class_getProperty([self class], "numberOfValidItemsForDrop")) { 
    // property exists 
} 

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

+0

我會試試看。並會檢查出參考。 – MikeMayer67

+0

以比我提議的更直接的方式回答測試的一半問題(測試相關方法)。但是,如果屬性不存在,在if子句中設置屬性是否安全,我還有更大的疑問。 – MikeMayer67

+0

我認爲只檢查一個屬性Obj-C運行時是一件代價昂貴的事情。 –

1

要檢查屬性的存在與否,可以直接使用:該屬性被認爲不是readonly

if ([yourClassObject respondsToSelector:@selector(set<yourPropertyName>:)]) { 
    NSLog(@"yes it exists"); 
} 
else{ 
    NSLog(@"no it doesn't exists"); 
} 
+1

這與基於sbooth建議的使用class_getProperty()有什麼不同? – MikeMayer67