第二次访问Singleton对象导致应用程序崩溃

时间:2010-06-29 07:10:06

标签: objective-c iphone

我这里有一个单例类是代码

#import <Foundation/Foundation.h>
#import "CustomColor.h"


@interface Properties : NSObject {
    UIColor *bgColor;
    CustomColor *bggColor;
}
@property(retain) UIColor *bgColor;
@property (retain) CustomColor *bggColor;

+ (id)sharedProperties;
@end

#import "Properties.h"

static Properties *sharedMyProperties = nil;

@implementation Properties

@synthesize bgColor;
@synthesize bggColor;

#pragma mark Singleton Methods
+ (id)sharedProperties
{
    @synchronized(self)
    {
            if(sharedMyProperties == nil)
            [[self alloc] init];
    }
    return sharedMyProperties;
}
+ (id)allocWithZone:(NSZone *)zone
{
    @synchronized(self)
    {
            if(sharedMyProperties == nil)
            {
                sharedMyProperties = [super allocWithZone:zone];
                return sharedMyProperties;
            }
    }
    return nil;
}
- (id)copyWithZone:(NSZone *)zone
{
  return self;
}
- (id)retain {
    return self;
}
- (unsigned)retainCount {
    return UINT_MAX; //denotes an object that cannot be released
}
- (void)release {
    // never release
}
- (id)autorelease {
    return self;
}
- (id)init {
    if (self = [super init])
    {
        bgColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1.0];

        FSColor *bc = [[FSColor alloc] init];
        bc.red = bc.green = bc.blue = bc.hue = bc.sat = bc.bri = 0;
        bggColor = bc;

    }
    return self;
}
- (void)dealloc
{
    // Should never be called, but just here for clarity really.
    [bgColor release];
    [bggColor release];
    [super dealloc];
}
@end

我有一个UIView'子类。我正在使用它。我每秒钟后调用drawRect方法。它只运行一次然后应用程序崩溃。

- (void)drawRect:(CGRect)rect 
{
    Properties *sharedProprties = [Properties sharedProperties];
    …...
    ….
    CGContextSetFillColorWithColor(context, [[sharedProprties bgColor] CGColor]);
    …..
}

3 个答案:

答案 0 :(得分:2)

如果你self.bgColor = [UIColor colorWithRed:...]怎么办?

没有self.我认为您可能直接访问ivar,因此为其分配一个自动释放的对象,该对象不会长时间存在(而不是使用合成的属性设置器,它会保留它)。我可能错了,我坚持使用较旧的Mac OS X系统,因此我无法使用Objective-C 2.0。

答案 1 :(得分:0)

永远不会分配您的静态sharedProperties。它在init方法或sharedProperties静态方法中缺失。

以下是singletons(上一篇文章)

的示例模式

同时访问没有自己的属性。也可能导致错误的访问错误。

此致

答案 2 :(得分:0)

不是答案,但请注意,对[Properties alloc]的简单调用将意味着它不再是单身人士!

+ (id)sharedProperties
{
  @synchronized(self)
  {
    if(sharedMyProperties == nil)
    {
      sharedMyProperties = [[self alloc] init];
    }
  }
  return sharedMyProperties;
}