2012-07-11 96 views
12

我需要棄用objective-c協議中的單個方法。在正常的類/實例方法中,我在聲明後添加__attribute__ ((deprecated));__attribute__((不建議使用))不適用於Objective-C協議方法?

看來,它不適用於協議方法。如果我將它們標記爲廢棄並在某處使用它們,則項目編譯成OK,而不會產生預期的棄用警告。

這是Apple LLVM 3.1的缺陷,還是我做錯了什麼?

+0

這仍然發生在LLVM 5.0中。雖然編譯器不顯示警告,但在使用Xcode自動完成時,它會用紅線將該方法劃掉。對此有何言論? – 2013-11-24 19:59:29

回答

7

雖然答案在這裏提供一些非常好的信息,他們已經過時。從Xcode 5.0和LLVM 5.0開始,它看起來像Objective-C協議方法的棄用警告是可以識別的。當實施該方法時,Xcode 5標記它:

警告:實施棄用方法

下面是我用來產生用於棄用協議方法的實施棄用警告步驟:

  1. 將協議方法標記爲__deprecated已棄用。從新的SDK 7.0文檔:

    __deprecated causes編譯器在使用棄用功能遇到代碼時產生警告。 __deprecated_msg()也是這樣,支持它的編譯器將打印一條消息以及棄用警告。這可能需要用-Wdeprecated標誌打開此類警告。應該在枚舉上使用__deprecated_enum_msg(),支持它的編譯器將打印棄用警告。

    #define __deprecated __attribute__((deprecated)) 
    

    要貶低你的方法,做這樣的事情:

    - (void)aDeprecatedProtocolMethod __deprecated; 
    

    僅此一項應該是足夠的Xcode顯示棄用警告。但是,您應該遵循接下來的幾個步驟(瞭解Xcode可能會非常挑剔),以確保顯示警告。

  2. 添加帶有棄用警告標籤的文檔註釋。請參見下面的代碼示例,以瞭解如何:

    /** Describe the method here - what does it do, how does it work, etc. Very brief. 
        @deprecated This delegate method is deprecated starting in version 2.0, please use otherMethodNameHere:withAnExtraParameter: instead. */ 
    - (void)aDeprecatedProtocolMethod __deprecated; 
    
  3. 清理項目( + + ķ),然後生成項目( + ) - 只是因爲Xcode有時可能很時髦。

我不是100%確定何時何地被引入這個功能(可能與SDK 7.0和10.9,或Xcode中5.0/5.0.1,或LLVM 5.0) - 但它仍然工作。

3

Apple不推薦使用UITableViewDelegate協議中的某些方法,也許您可​​以使用Apple的代碼作爲示例查找解決方案。

協議的相關代碼如下:

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView 
     accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath 
__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0); 

正如你可以看到,蘋果採用的宏。也許這是要走的路?

編輯:正如以下鏈接[1] __attribute__((deprecated))是一個GCC構造,所以這可能無法在LLVM中工作。我猜這是蘋果使用宏的原因,所以當其他編譯器被使用時,其他一些(或不)棄用構造將被調用。

[1] How to deprecate a method in Xcode

+0

宏擴展爲'__attribute __((availability(ios,introduced = 2.0,deprecated = 3.0)))''。請參閱'Availability.h'和'AvailabilityInternal.h'(均在'/ usr/include /'中) – JustSid 2012-07-11 14:47:13

+0

是的,他們談論的是GCC,但__attribute __((不推薦))實際上在Apple LLVM上工作,除協議外。目前這令人困惑。 – 2012-07-11 15:07:07

4

好了,我才意識到,即使蘋果公司使用__attribute__((deprecated))末。而且它也不起作用。如果我使用任何不推薦的委託方法,例如

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView 
    accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath 

沒有警告。

所以它看起來像雷達的候選人。

編輯:提起雷達,錯誤編號11849771.

+0

關於「Bug ID#11849771」的任何更新? – Vasu 2013-01-23 05:51:30

+0

不幸的是,沒有 – 2013-01-25 13:54:22