2016-12-14 1 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メンバ参照型の構造体objc_classはポインタです - >"

enter image description here なぜ私はエラーが発生していますか?あなたの誰かがこれを回避する方法を知っていますか?

+1

全く無関係selfているので、あなたがそれによってココアの命名規則を以下検討するかもしれませんクラス名は大文字で始まります(例えば 'HTTPRequest'や' HttpRequest')。それは単に規約に過ぎませんが、コードを少し読みやすくしています。そして、さらに遠くに行くと、「要求」は通常、特定のNSURLSessionTask(Webサービスからの特定の要求)に関連付けられているため、名前に「Request」を使用することはできません。 '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が、これは動作するようになっている、実際にすぎ

+(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の相互運用性のために設計されています)。しかし、あなたは1つだけhttpRequestを持っているので、それは過剰です。

関連する問題