我在iPhone应用程序中创建了以下Singleton:
#import "AppManager.h"
static AppManager *sharedAppManager = nil;
@implementation AppManager
@synthesize currentType, listOfTypes;
#pragma mark Singleton Methods
+ (id)sharedManager {
@synchronized(self) {
if (sharedAppManager == nil)
sharedAppManager = [[self alloc] init];
}
return sharedAppManager;
}
- (id)init {
if (self = [super init]) {
currentType = @"";
listOfTypes = [NSArray arrayWithObjects:@"T1", @"T2", @"T3", nil];
}
return self;
}
- (void)dealloc {
// Should never be called, but just here for clarity really.
[currentType release];
[listOfTypes release];
[super dealloc];
}
@end
当我使用它时:
// TEST
AppManager *appManager = [AppManager sharedManager];
NSArray *array = appManager.listOfTypes;
NSLog(@"TYPES:%@", array);
我有一件奇怪的事情......
TYPES:<UIButtonContent: 0x7b8db10 Title = (null), Image = <UIImage: 0x7bad7f0>, Background = (null), TitleColor = UIDeviceWhiteColorSpace 1 1, ShadowColor = UIDeviceWhiteColorSpace 0 0.5>
使用currentType(NSString属性)可以正常工作,但不适用于listOfTypes(NSArray)
答案 0 :(得分:3)
您没有保留数组 listOfTypes ,因此数组可能已被释放并指向一些垃圾值。使用以下命令保留数组(如果它是保留/复制的属性)。
self.listOfTypes = [NSArray arrayWithObjects:@"T1", @"T2", @"T3", nil];
您也可以简单地将保留消息发送到阵列。
listOfTypes = [[NSArray arrayWithObjects:@"T1", @"T2", @"T3", nil] retain];
或分配数组。
listOfTypes = [[NSArray alloc] initWithObjects:@"T1", @"T2", @"T3", nil];
答案 1 :(得分:1)
listOfTypes = [NSArray arrayWithObjects:@"T1", @"T2", @"T3", nil];
这一行将自动释放的数组直接分配给您的实例变量。当您访问它时,内存已被重新分配给不同的对象。
我假设您的listOfTypes是一个保留属性。分配正在使用self.listOfTypes=
或在上面的代码中添加retain
。
您没有在其他属性中看到此内容,因为您已分配了一个未释放的静态字符串。