我的程序使广播电台自动化。它和 iTunes 之间有很多来回的通信。我用脚本桥对其进行了编程。脚本桥受内存泄漏的影响。每次调用脚本桥都会泄漏少量内存。向 24/7 运行的程序添加大量调用,我的软件将运行不到 24 小时,然后退出。
我对解决方案的第一次尝试是尽量减少对脚本桥的调用。在为此进行研究时,我遇到了 ItunesLibrary。它不适合我。
NSError *error = nil;
ITLibrary *library = [ITLibrary libraryWithAPIVersion:@"1.0" error:&error];
if (library)
{
NSArray *playlists = [[NSArray alloc]init];
playlists = library.allPlaylists;
NSArray *tracks = [[NSArray alloc]init];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"mediaKind == %d", ITLibMediaItemMediaKindSong];
tracks = [library.allMediaItems filteredArrayUsingPredicate:predicate];
NSLog(@"Playlists - %@",playlists);
NSLog(@"Tracks - %@",tracks);
}
这段代码几乎完全来自 Apple 的文档。它应该工作 - 我认为。
在添加谓词之前,我在 iTunes 库中获得了有关每个播客的一些信息。在 nslog 输出中,我的每个播放列表都会生成一个类似于“”的条目。我的每一首歌都只显示(null)。
所有信息都在 iTunes 中。我可以用脚本桥阅读它。我可以用 AVAsset 阅读它
AVAsset *asset = [AVURLAsset URLAssetWithURL:myUrl options:nil];
NSArray *metadata = [asset commonMetadata];
for ( AVMetadataItem* item in metadata )
{
NSString *key = [item commonKey];
NSString *value = [item stringValue];
NSLog(@"key = %@, value = %@", key, value);
}
使用 AVAsset,我只能得到歌曲名称、专辑名称和艺术家姓名。我需要访问其余的 iTune 的 ID3 标签。
我做了什么来破坏 ItunesLibrary?