以下に説明する問題と解決策があります。しかし、私たちの解決策は、この問題を解決するための実際の「正しい方法」ではないと思います。
1:データ用のスレッドセーフシングルトンがあります
//DataSingleton.h
@interface DataSingleton : NSObject
@property (nonatomic, readonly, retain) NSString *userLogin;
-(void)setPrettyLogin:(NSString*)prettyLogin;
@end
と
//DataSingleton.m
#import "DataSingleton.h"
@synthesize userLogin = _userLogin;
+(id)sharedSingleton{
static dispatch_once_t DataSPred;
static DataSingleton *shared = nil;
dispatch_once(&DataSPred, ^{ shared = [[self alloc] init]; });
return shared;
}
-(void)setPrettyLogin:(NSString*)prettyLogin{
_userLogin = prettyLogin;
}
@end
2:ネットワークにも同じシングルトンがあり、機能を使用しています
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{ <block> }];
// I know about mainQueue - only for UI. Here it is, for clarity.
3:問題
NSURLConnectionブロック内で[[DataSingletonsharedSingleton]userLogin]を取得しようとすると(NetworkSingletonメソッドの1つで)-同じ時刻を取得し、_userLoginでゴミを見つけました=(
4:悪い解決策
私は約1時間費やしましたが、私の質問に対する正しい答えが見つかりません。そしてこれを作成します:
//DataSingleton.h
@interface DataSingleton : NSObject{
NSString* _userLogin;
}
-(NSString*)userLogin;
-(void)setPrettyLogin:(NSString*)prettyLogin;
@end
と
//DataSingleton.m
#import "DataSingleton.h"
+(id)sharedSingleton{
static dispatch_once_t DataSPred;
static DataSingleton *shared = nil;
dispatch_once(&DataSPred, ^{ shared = [[self alloc] init]; });
return shared;
}
-(NSString*)userLogin{
return _userLogin;
}
-(void)setPrettyLogin:(NSString*)prettyLogin{
_userLogin = [prettyLogin retain];
//I can,t release it and
//static code analysis is not happy with what is happening
}
@end
誰かアイデアがありますか?
よろしくセルゲイ