2016-12-14 94 views
0

我試圖實現一個單例來管理NSURLSession請求。這裏是我的代碼:NSURLSession成員引用類型struct objc_class是一個指針

頭文件

@interface httpRequest : NSObject 

@property (strong,nonatomic) NSURLSession *session; 

+(httpRequest*)request; 

實現文件(.M):

+(httpRequest*)request 
{ 
    static httpRequest *shareObject = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once (&onceToken, ^{ 
     shareObject = [[self alloc] init]; 
     self.session = [NSURLSession sharedSession]; 
    }); 
    return shareObject; 
} 

但在這行:

self.session = [NSURLSession sharedSession]; 

我得到這個錯誤:「NSURLSession成員引用類型struct objc_class是一個指針,你的意思是使用 - >」

enter image description here 爲什麼我得到錯誤?,你們誰知道解決這個問題的方法?

+1

完全無關,你可以考慮以下可可命名約定,其中類名以大寫字母開頭(例如'HTTPRequest'或'HttpRequest')。這僅僅是一個約定,但它使代碼更容易閱讀。而且,即使在更遠的地方,我也不確定我會在名稱中使用「Request」,因爲「request」通常與特定的「NSURLSessionTask」(來自Web服務的特定請求)相關聯,而不是'NSURLSession'本身。因此,我可能將其命名爲'HTTPManager'或類似的名稱以避免請求/會話命名混淆...... – Rob

回答

2

的常用方法是使用init方法

+(httpRequest*)request 
{ 
    static httpRequest *shareObject = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once (&onceToken, ^{ 
     shareObject = [[self alloc] init]; 
    }); 
    return shareObject; 
} 


- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     self.session = [NSURLSession sharedSession]; 
     } 
    } 
    return self; 
} 

但由於sharedObject實際上是self這個應該工作,太

+(httpRequest*)request 
{ 
    static httpRequest *shareObject = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once (&onceToken, ^{ 
     shareObject = [[self alloc] init]; 
     shareObject.session = [NSURLSession sharedSession]; 
    }); 
    return shareObject; 
} 
0

在一個類方法(一個以+開頭的方法)中,self指的是類,而不是實例。我想你打算shareObject.session。就個人而言,我會將session的設置移至init方法(在這種情況下,您將使用self.session語法)。

或者,在Objective-C中,您現在可以定義class屬性(設計用於Swift互操作性)。但是,因爲你只有一個httpRequest,這太過分了。