1

昨日、テーブル ビューとテーブル ビュー内の各セルに固有の詳細ビューをリンクすることについて質問しました。ここで私の質問に対する良い答えを得たと思います。(うまくいけば、あなたはその投稿を読んで、私が必要なものを見ることができます). 基本的に、シングルトンを正しく作成しているかどうかを知りたかったのです。これが私のコードです:

timerStore.h

#import "Tasks.h"
@interface timerStore : NSObject
{
    NSMutableDictionary *allItems;
}
+(timerStore *)sharedStore;
-(NSDictionary *)allItems;
-(NSTimer *)createTimerFor:(Tasks *)t inLocation: (NSIndexPath *)indexPath;
-(void)timerAction;
@end

timerStore.m

@implementation timerStore

+(timerStore *)sharedStore{
    static timerStore *sharedStore = nil;
    if (!sharedStore)
        sharedStore = [[super allocWithZone:nil]init];
    return sharedStore;
}
+(id)allocWithZone:(NSZone *)zone{
    return [self sharedStore];
}
-(id)init {
    self = [super init];
    if (self) {
        allItems = [[NSMutableDictionary alloc]init];
    }
    return self;
}
-(NSDictionary *)allItems{
    return allItems;
}
-(NSTimer *)createTimerFor:(Tasks *)t inLocation: (NSIndexPath *)indexPath {
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:t.timeInterval target:self selector:@selector(timerAction) userInfo:nil repeats:1.0];
    [allItems setObject:timer forKey:indexPath];
    return timer;
}
-(void)timerAction{
//custom properties here
}
@end

下にスクロールすると (デキュー)、セルのインデックス パスが再利用されるという印象を受けていたので、ちょっと混乱しています。私は間違っているかもしれませんが。とにかく、リンクの男が示唆したように、私はシングルトンを作成する正しい道を進んでいますか?

4

1 に答える 1

2

アプリシングルトンを実装する最良の方法は次のとおりです

ヘッダーファイル

#import <Foundation/Foundation.h>

@interface AppSingleton : NSObject

@property (nonatomic, retain) NSString *username;

+ (AppSingleton *)sharedInstance;

@end

実装ファイル

#import "AppSingleton.h"

@implementation AppSingleton
@synthesize username;

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

// Initializing
- (id)init {
    if (self = [super init]) {
        username = [[NSString alloc] init];
    }
    return self;
}

@end

注:これが行うことは、メソッドで一度だけ初期化される静的変数(ただし、この翻訳単位 に対してのみグローバル)sharedInstanceを定義することです。一度だけ作成されるようにする方法は、from Grand Central Dispatch (GCD)を使用することです。これはスレッド セーフであり、OS によって完全に処理されるため、まったく心配する必要はありません。sharedInstancedispatch_once method

シングルトンを使用して値を設定するには

[[AppSingleton sharedInstance] setUsername:@"codebuster"];

シングルトンを使用して値を取得します。

NSString *username = [[AppSingleton sharedInstance] username];

さらなる参照と読み物

于 2013-07-29T04:32:27.233 に答える