Objective c iOS 5:某些引用未被保留

Objective c iOS 5:某些引用未被保留,objective-c,ios5,Objective C,Ios5,在使用iOS5和Xcode 4.2之后,我看到了一些有趣的行为。我有一个单例类,它包含一个UIImage变量和一个NSString变量,但由于某些原因,即使我使用属性,UIImage变量也不会被保留。我在其他项目中也使用过同样的代码来处理单例,它一直工作得很好,但在iOS5中它似乎被破坏了。顺便说一下,我没有使用ARC 下面是头文件的示例: @interface MYSingleton : NSObject { NSString *aString; UIImage *anIma

在使用iOS5和Xcode 4.2之后,我看到了一些有趣的行为。我有一个单例类,它包含一个UIImage变量和一个NSString变量,但由于某些原因,即使我使用属性,UIImage变量也不会被保留。我在其他项目中也使用过同样的代码来处理单例,它一直工作得很好,但在iOS5中它似乎被破坏了。顺便说一下,我没有使用ARC

下面是头文件的示例:

@interface MYSingleton : NSObject {

    NSString *aString;
    UIImage *anImage;
}

@property (nonatomic, retain) NSString *aString;
@property (nonatomic, retain) UIImage *anImage;

+ (MYSingleton *) instance;

@end
下面是相应的实现文件:

@implementation MYSingleton

static MYSingleton *instance = nil;

@synthesize aString, anImage;

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

+ (MYSingleton *) instance {
    @synchronized(self) {
        if (instance == nil) {
            [[MYSingleton alloc] init]; // assignment not done here
        }
    }

    return instance;
}

+ (id)allocWithZone:(NSZone *)zone {
    @synchronized(self) {
        if (instance == nil) {
            instance = [super allocWithZone:zone];
            return instance; 
        }
    }

    return nil; 
}

- (id)copyWithZone:(NSZone *)zone {
    return self;    
}

- (id)retain {
    return self;    
}

- (unsigned)retainCount {
    return UINT_MAX;  
}

- (void)release {
    // do nothing    
}

- (id)autorelease {
    return self;
}

@end
根据大众的需求,以下是我如何为UIImage变量赋值:

- (void)imagePickerController:(UIImagePickerController  *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    id image = [info objectForKey:UIImagePickerControllerOriginalImage];

    MYSingleton *m = [MYSingleton instance];
    m.anImage = image
}
我还注意到iOS 5中可能存在相关的差异,但我创建了一个类别。此类别是针对UID设备的。我添加了一个以字符串形式返回平台的方法。我在类别实现文件顶部声明的静态变量中缓存字符串。第一次调用该方法时,静态变量为nil,因此该值将被计算并存储在静态变量中。在随后调用该方法时,将返回缓存的变量。这在iOS 4中运行得很好,但在iOS 5中,当多次调用此方法时,会抛出EXEC_BAD_访问错误(我单步执行代码时除外)


非常感谢您的帮助。

首先,singleton是一堆废话(是的,我从文档中知道这是一堆废话——仍然是一堆废话)。如果要实现单例,只需执行以下操作:

@implementation MYSingleton
+ (id)sharedInstance
{
     static MYSingleton *instance = nil;
     static dispatch_once_t once;
     dispatch_once(&once, ^{
          instance = [[self alloc] init]; 
     });
     return instance;
}
... etc ...
@end
其余的都是打字的浪费

其次,您不显示与崩溃的东西相关的代码。不过,最好的猜测是,您的代码正在执行:

anImage = [... some random method that returns an image....];
当你真正的意思是:

self.anImage = [ ... ];
也就是说,您没有使用setter,图像也不会保留。也许这是你最近做的一个改变。在以前的版本中,由于缓存的原因,该映像可能是一个单例


很难说没有看到更多的代码。

你没有显示你在哪里创建“动画图像”或者它是如何被使用的。+1关于self.anImage可能就是它。没见过你一次单身-很有趣。医生的单身并不一定是不正确的,只是可能过于保守。粘贴时会浪费缓冲区;)谢谢你的回复。我希望我能从我看到的实现单例模式的各种不同方式中得到一分钱。这是新的,谢谢。至于我如何做作业,请看我的编辑。正如我所说,这在iOS 4中有效,但在iOS 5中无效。这是我22年来(在许多团队中)使用的GCD版本。“推荐”模式的实际情况是,它只是隐藏了bug,使得以后重构为非单例模式更加困难。