object-c編程tips-給類對象添加屬性

來源:互聯網
上載者:User

標籤:style   http   使用   strong   io   問題   代碼   log   

此問題來源於網路封裝的一個內容,由於保密的問題,我只敘述我業餘的一些想法。


基本思想:

網路請求大家應該都會用一個基類的BaseNetWork, 然後由衍生類別繼承於BaseNetWork,並實現一些特殊的方法。 一般標準的流程是傳入block, 當網路請求完畢後,通過block回調回來。這裡敘述的關鍵不是如何?一個網路請求和回調block的相關內容,而是如何取消請求。 一般基類會實現一個cancelNetWork方法,它根據自己的url進行cancel操作。 


舉例:

我們使用 DerivedNetWork* net = [DerivedNetWork alloc]init]; 在init方法中設定了自身的url,然後調用基類的sendRequest發送請求, 等待網路返回的回調。 如果需要取消請求,難道我們使用[net CancelNetWork];,這樣肯定不好。 畢竟在其他的方法裡面不能得到當前的net指標,儲存成成員又沒有必要。 於是大家會想到應該使用類名進行cancel操作。 即將cancelNetWork定義成類方法,而不是對象方法。 這就引入了一個新的問題, 類方法如何擷取到對象的url? 經過苦思冥想,有一天發現了objc_setAssociatedObject方法,又聯想到類對象本身也是對象的思路,想到一個解決方案。


方案:

基類NetWork類的實現代碼:

#define LSPerson_URL_Key @"LSPerson_URL_Key"@implementation BaseNetWork-(void)setUrl:(NSString *)url{    objc_setAssociatedObject([self class], LSPerson_URL_Key, url, OBJC_ASSOCIATION_COPY_NONATOMIC);}+(void)cancelRequest{    NSString* url =  objc_getAssociatedObject([self class], LSPerson_URL_Key);    NSLog(@"cancelRequestUrl:%@", url);}@end
上面基類有一個setUrl方法,供衍生類別的對象使用設定自身的url, 它將url綁定到self class的類對象上。 然後還有一個cancelRequest類方法,它從當前類對象中讀取到url,來進行真正的cancel操作。 通過這種方式,衍生類別可以使用此類方法進行自由的取消請求操作了。

代碼:

<p class="p1">LPStudyRequest* lpReq = [[LPStudyRequest alloc]init];</p><p class="p2"><span class="s1">lpReq.url = </span>@"http://www.baidu.com"<span class="s1">;</span></p><p class="p2"><span class="s1"></span></p><p class="p4"><span class="s2">//</span>可以看到日誌的輸出,不同的衍生類別可以得到不同的<span class="s2">url</span>。再使用此<span class="s2">url</span>傳遞給<span class="s2">AF</span>進行取消操作。</p><p class="p1">[LPStudyRequest cancelRequest];</p>

總結:

上面是一個基本的給類添加變數的思想。 它在這個取消網路請求裡面得到了很好的應用。 我還將它用到防止自身提前釋放, 仿C++的靜態變數中。

請一定要注意: C++的靜態變數和object-c裡面用到的單例static是不一樣的。 一個是屬於類的靜態變數,一個是屬於全域程式的靜態變數。 如果基類定義了靜態變數,衍生類別繼承的話, C++的衍生類別會很好的繼承下來, OC的所有的衍生類別對象公有的是同一個記憶體, 因此可以考慮使用綁定到類對象中類比這種情況。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.