plist에 일부 데이터를로드하고 저장하는 PoolManager
이라는 싱글 톤 개체가 있습니다. 내 프로그램에서 내 수영장에 대해 알아야 할 것이있을 때 [PoolManager sharedPoolManager]
에 속성이 있는지 묻습니다. 나는이 속성을 설정하는 책임이있는 단일보기와 다른 모든 사람들이 방금 읽은보기를 가지고 있습니다. 모든 것이 잘 작동했는데, 아무 이유없이 내가 알 수 있듯이, 충돌이 시작되었습니다. NSZombieEnabled = YES
을 설정하면 두 개의 NSString
속성 중 하나에 액세스 할 때 해당 속성이 해제 된 것처럼 보입니다. 디버거 메시지는 다음과 같습니다. *** -[CFString respondsToSelector:]: message sent to deallocated instance 0x5a336d0
어떻게 든 내 싱글 톤 속성이 공개됩니다.
모든 것이 작동하는 이전 스냅 샷으로 돌아가려고했는데 여전히 작동합니다. 저는 어제부터 TimeMachine을 사용하여 프로젝트로 돌아갔습니다. 나는 당황 스럽다.
여기에 싱글 톤 객체 코드가 있습니다. 분명히 좀비 인 surface
및 shape
문자열입니다. 죄송합니다 모든 NSLogs
// MyPoolSingleton.h
#import <Foundation/Foundation.h>
#define kFileName @"data.plist"
@interface PoolManager : NSObject {
float volume;
float length;
float width;
float depth;
NSString *surface;
NSString *shape;
BOOL isMetric;
int fcTarget;
int cyaTarget;
int taTarget;
int chTarget;
int saltTarget;
}
@property float volume;
@property float length;
@property float width;
@property float depth;
@property (nonatomic, retain) NSString *surface;
@property (nonatomic, retain) NSString *shape;
@property BOOL isMetric;
@property int fcTarget;
@property int cyaTarget;
@property int taTarget;
@property int chTarget;
@property int saltTarget;
+ (PoolManager*)sharedPoolManager;
- (void)retrieveState;
- (void)saveState;
- (NSString*)dataFilePath;
@end
개인적으로
// MyPoolSingleton.m
#import "PoolManager.h"
@implementation PoolManager
@synthesize volume;
@synthesize length;
@synthesize width;
@synthesize depth;
@synthesize surface;
@synthesize shape;
@synthesize isMetric;
@synthesize fcTarget;
@synthesize cyaTarget;
@synthesize taTarget;
@synthesize chTarget;
@synthesize saltTarget;
static PoolManager* _sharedPoolManager = nil;
+ (PoolManager*)sharedPoolManager {
@synchronized([PoolManager class])
{
if (!_sharedPoolManager)
[[self alloc] init];
return _sharedPoolManager;
}
return nil;
}
+ (id)alloc {
@synchronized([PoolManager class])
{
NSAssert(_sharedPoolManager == nil, @"Attempted to allocate a second instance of a singleton.");
_sharedPoolManager = [super alloc];
return _sharedPoolManager;
}
return nil;
}
- (id)init {
self = [super init];
return self;
}
- (void)retrieveState {
NSLog(@"--retrieveState");
NSString *filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSLog(@" fileExistsAtPath: reading array from plist");
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
volume = [[array objectAtIndex:0] floatValue];
NSLog(@" reading array: volume = %1.1f", volume);
length = [[array objectAtIndex:1] floatValue];
NSLog(@" reading array: length = %1.1f", length);
width = [[array objectAtIndex:2] floatValue];
NSLog(@" reading array: width = %1.1f", width);
depth = [[array objectAtIndex:3] floatValue];
NSLog(@" reading array: depth = %1.1f", depth);
self.surface = [array objectAtIndex:4];
NSLog(@" reading array: surface = %@", surface);
self.shape = [array objectAtIndex:5];
NSLog(@" reading array: shape = %@", shape);
isMetric = [[array objectAtIndex:6] boolValue];
NSLog(@" reading array: isMetric = %d", isMetric);
fcTarget = [[array objectAtIndex:7] intValue];
NSLog(@" reading array: fcTarget = %d", fcTarget);
cyaTarget = [[array objectAtIndex:8] intValue];
NSLog(@" reading array: cyaTarget = %d", cyaTarget);
taTarget = [[array objectAtIndex:9] intValue];
NSLog(@" reading array: taTarget = %d", taTarget);
chTarget = [[array objectAtIndex:10] intValue];
NSLog(@" reading array: chTarget = %d", chTarget);
saltTarget = [[array objectAtIndex:11] intValue];
NSLog(@" reading array: saltTarget = %d", saltTarget);
[array release];
}
else {
NSLog(@" !fileExistsAtPath: intitializing values to nil/zero");
volume = 0.0;
length = 0.0;
width = 0.0;
depth = 0.0;
surface = @"";
shape = @"";
isMetric = NO;
fcTarget = 0.0;
cyaTarget = 0.0;
taTarget = 0.0;
chTarget = 0.0;
saltTarget = 0.0;
}
}
- (void)saveState {
NSLog(@"--saveState");
NSMutableArray *array = [[NSMutableArray alloc] init];
NSLog(@" building array: volume = %1.1f", volume);
[array addObject:[NSNumber numberWithFloat:volume]];
NSLog(@" building array: length = %1.1f", length);
[array addObject:[NSNumber numberWithFloat:length]];
NSLog(@" building array: width = %1.1f", width);
[array addObject:[NSNumber numberWithFloat:width]];
NSLog(@" building array: depth = %1.1f", depth);
[array addObject:[NSNumber numberWithFloat:depth]];
NSLog(@" building array: surface = %@", surface);
[array addObject:surface];
NSLog(@" building array: shape = %@", shape);
[array addObject:shape];
NSLog(@" building array: isMetric = %d", isMetric);
[array addObject:[NSNumber numberWithBool:isMetric]];
NSLog(@" building array: fcTarget = %d", fcTarget);
[array addObject:[NSNumber numberWithInt:fcTarget]];
NSLog(@" building array: cyaTarget = %d", cyaTarget);
[array addObject:[NSNumber numberWithInt:cyaTarget]];
NSLog(@" building array: taTarget = %d", taTarget);
[array addObject:[NSNumber numberWithInt:taTarget]];
NSLog(@" building array: chTarget = %d", chTarget);
[array addObject:[NSNumber numberWithInt:chTarget]];
NSLog(@" building array: saltTarget = %d", saltTarget);
[array addObject:[NSNumber numberWithInt:saltTarget]];
[array writeToFile:[self dataFilePath] atomically:YES];
[array release];
}
- (NSString*)dataFilePath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:kFileName];
}
- (void)dealloc {
[shape release], shape = nil;
[surface release], surface = nil;
[super dealloc];
}
@end
코드를 짧게 만들려면 @synthesize var1, var2, var2; 각각에 대해 별도의 줄을 사용하는 대신 –
고마워, 나는 돌아가서 그런 것들을 정리하기 시작했다. – Steve