在不带Xcode的设备上运行的行为与不带Xcode的设备上运行的行为的差异

时间:2019-04-25 20:06:56

标签: ios objective-c xcode singleton

当我发现一个意外的行为时,我是一个新老的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。

  1. 为什么从在设备上的Xcode中运行它到在设备上独立地运行,行为会发生变化?

  2. 从这个意义上讲,我应该寻找什么才能告诉我如何解决此问题?我觉得这里缺少了一些大而简单的东西。

我正在将Xcode 10.2.1与SDK 12.2一起使用。部署目标是iOS 11.0。

谢谢!

0 个答案:

没有答案