0

以下に説明する問題と解決策があります。しかし、私たちの解決策は、この問題を解決するための実際の「正しい方法」ではないと思います。

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

誰かアイデアがありますか?

よろしくセルゲイ

4

1 に答える 1

1

セッターに値を保持する必要があります。実際、問題はスレッド化とは何の関係もありません。

あなたの機能はほぼ正しいです。

-(void)setPrettyLogin:(NSString*)prettyLogin {
    _userLogin = [prettyLogin retain];
}

しかし、それは

-(void)setPrettyLogin:(NSString*)prettyLogin {
    if (_userLogin != prettyLogin) {
         NSString *tmp = _userLogin;
         _userLogin = [prettyLogin retain];
         [tmp release];
    } 
}

-(void)dealloc {
    [_userLogin release];
    [super dealloc];
}

バリューコールをリリースしたくない場合は、

[[DataSingleton sharedSingleton] setPrettyLogin:nil];
于 2012-09-12T14:24:04.553 に答える