程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> object-c編程tips-給類對象添加屬性

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

編輯:關於C語言

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


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


基本思想:

網絡請求大家應該都會用一個基類的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操作。 通過這種方式,派生類可以使用此類方法進行自由的取消請求操作了。

代碼:

LPStudyRequest* lpReq = [[LPStudyRequest alloc]init];

lpReq.url = @"http://www.baidu.com";

//可以看到日志的輸出,不同的派生類可以得到不同的url。再使用此url傳遞給AF進行取消操作。

[LPStudyRequest cancelRequest];


總結:

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

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


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved