Я новичок, работающий над старым проектом Objective C XCode, когда я заметил неожиданное поведение: синглтон ведет себя так, как ожидалось, когда я запускаю проект на iPhone XSMax из XCode.Он работает по-разному, когда я запускаю его на iPhone без Xcode.
В этом приложении для радиостанции я использую базовую модель Cocoapod (https://github.com/nicklockwood/BaseModel) в качестве основы для хранения синглтонаи сохранять любимые песни, которые пользователь выбирает во время прослушивания радио. Каждый любимый элемент состоит из нескольких свойств строк, включая название дорожки, название, альбом, включая один элемент NSDictionary, который содержит четыре пары значение / ключ для некоторого html-кода об исполнителе.
Пользователь нажимает кнопку на ВК, чтобы сохранить информацию о текущей дорожке (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];
Это прекрасно работает, когда приложение работает на iPhone XSMax, запущенном из XCode. Однако, когда приложение запускается само по себе на телефоне, любой любимыйи содержащиеся в нем свойства сохраняются в изменяемый массив, сохраняются правильно , за исключением для словаря trackInfo: thВ trackInfo для любого нового сделанного фаворита немедленно отобразится trackInfo для текущей воспроизводимой дорожки trackInfoSRK (все остальные свойства строки в порядке).
Это похоже на то, что trackInfo избранного трека становится указателем на переменную, для которой он был установлен, с текущей воспроизводимой дорожки, и он всегда будет отражать ее до перезапуска приложения (после чегоизбранное замораживается до последнего trackInfoSRK, в котором оно находилось в этом состоянии «зеркалирования».
Почему любое поведение изменилось бы из-за запуска его в Xcode на устройстве и его автономного запуска на устройстве?
Что я должен искать в этом смысле, который подскажет мне, как это исправить? Я чувствую, что мне здесь не хватает чего-то большого, но простого.
Я использую Xcode 10.2.1 с SDK 12.2. Цель развертывания - iOS 11.0.
Заранее спасибо!