当我发现一个意外的行为时,我是一个新老的Objective C XCode项目的新手:当我在XCode的iPhone XSMax上运行该项目时,单例的行为符合预期。在没有Xcode的iPhone上运行时,它的行为有所不同。
在此广播电台应用中,我使用Basemodel Cocoapod(https://github.com/nicklockwood/BaseModel)作为单例存储和持久存储用户在收听广播时选择的喜欢歌曲的基础。每个喜欢的项目都包含几个字符串属性,包括曲目名称,标题,专辑,其中包括一个NSDictionary项目,其中包含有关艺术家的一些html的四个值/键对。
用户按下VC上的按钮,将当前轨道信息(trackInfoSRK)保存到其他收藏的轨道的可变数组中,然后保存。
//FavoriteItem.h
#import <Foundation/Foundation.h>
#import "BaseModel.h"
@interface FavoriteItem : BaseModel;
@property (nonatomic, retain) NSDate *time;
@property (nonatomic, retain) NSTimeZone *listenedTimeZone;
@property (nonatomic, retain) NSString *artist;
@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSString *album;
@property (nonatomic, retain) NSString *year;
@property (nonatomic, retain) NSString *duration;
@property (nonatomic, retain) NSURL *albumURL;
@property (nonatomic, retain) UIImage *albumImg;
@property BOOL albumErr;
@property BOOL albumLoaded;
@property(nonatomic, retain) NSMutableDictionary *trackInfo;
@end
//FavoriteItem.m
#import <Foundation/Foundation.h>
#import "FavoriteItem.h"
#import "FavoriteList.h"
@implementation FavoriteItem
- (id)init
{
self = [super init];
if (self) {
self.albumErr=FALSE;
self.albumLoaded=FALSE;
}
return self;
}
- (BOOL)save
{
//save the favorites list
return [[FavoriteList sharedInstance] save];
}
@end
//FavoriteList.h
@interface FavoriteList : BaseModel
@property (nonatomic, strong) NSMutableArray *favorites;
@end
//FavoriteList.m
#import "FavoriteList.h"
#import "FavoriteItem.h"
@implementation FavoriteList
- (void)setUp
{
self.favorites = [NSMutableArray array];
}
+ (BMFileFormat)saveFormat
{
//return BMFileFormatHRCodedJSON;
return BMFileFormatHRCodedXML;
}
@end
在VC中设置属性时:
//trackInfoSRK is currently playing trackInfo dict, and it set up in viewDidLoad:
trackInfoSRK = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"", @"PAArtistHTML",
@"", @"PAArtistLink",
@"", @"lastFMArtistHTML",
@"", @"lastFMArtistLink",nil];
//trackInfoSRK is populated along the way. Then when it's favorited:
FavoriteItem *thisFavorite =[[FavoriteItem alloc] init];
thisFavorite.artist = artistName;
thisFavorite.title = songTitle;
.
.
.
thisFavorite.trackInfo = trackInfoSRK;
[[FavoriteList sharedInstance].favorites insertObject:thisFavorite atIndex:0];
NSLog(@"Adding Favorite at index 0");
BOOL saveGood=[[FavoriteList sharedInstance] save];
当应用程序在从Xcode启动的iPhone XSMax上运行时,此方法就可以正常工作。但是,当应用程序在手机上自行运行时,任何收藏夹和包含的属性都会保存到可变数组中,并正确保存例外,用于字典trackInfo属性:任何新收藏夹的trackInfo都会立即保存显示当前播放曲目的trackInfo trackInfoSRK(其余所有字符串属性都可以)。
这就像收藏的曲目的trackInfo成为指向当前播放曲目中要设置的变量的指针,并且它将始终镜像到该变量,直到应用重新启动(此时收藏夹被冻结到它在此“镜像”状态下拥有的最后一个trackInfoSRK。
为什么从在设备上的Xcode中运行它到在设备上独立地运行,行为会发生变化?
从这个意义上讲,我应该寻找什么才能告诉我如何解决此问题?我觉得这里缺少了一些大而简单的东西。
我正在将Xcode 10.2.1与SDK 12.2一起使用。部署目标是iOS 11.0。
谢谢!