我遇到的问题是我想在SpringBoard,Safari,Settings,Notes等应用程序中使用一个对象。我使用的是Singleton模式。但是当我转储这些对象时,它们拥有自己的分配。因此,我认为它们是不同的对象。有没有办法让对象在应用程序中保持活动状态?我有root权限。
这是我登录HomeScreen(SpringBoard),Safari和设置:
Oct 20 17:05:5 MyPhone SpringBoard[982] <Warning>: MyClass: <MyClass: 0x17f72680>
Oct 20 17:06:29 MyPhone MobileSafari[1001] <Warning>: MyClass: <MyClass: 0x15da9b60>
Oct 20 17:06:34 MyPhone Preferences[1002] <Warning>: MyClass: <MyClass: 0x175864c0>
MyClass.h
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
+ (instancetype)sharedInstance;
- (void)doSomething;
@end
MyClass.m
#import "MyClass.h"
@implementation MyClass
- (instancetype)init {
self = [super init];
return self;
}
+ (instancetype)sharedInstance {
static dispatch_once_t p = 0;
__strong static id _sharedSelf = nil;
dispatch_once(&p, ^{
_sharedSelf = [[self alloc] init];
});
return _sharedSelf;
}
- (void)doSomething {
NSLog(@"MyClass: %@", self);
}
@end
Tweak.xm
#import <SpringBoard/SpringBoard.h>
#import <MyClass.h>
%hook SpringBoard
- (void)applicationDidFinishLaunching:(UIApplication *)application {
%orig;
MyClass *myClass = [MyClass sharedInstance];
[myClass doSomething];
}
%end
%hook UIViewController
- (void)viewDidLoad {
%orig;
MyClass *myClass = [MyClass sharedInstance];
[myClass doSomething];
}
%end
答案 0 :(得分:0)
每个进程都有自己的变量副本,因为这是进程在iOS中运行的方式(而不仅仅是在iOS中)。每个进程都有自己独立的内存,数据之间根本不共享。因此,您的单身人士将为每个流程单独构建。
答案 1 :(得分:0)
如果要使用同一个对象,则必须开发一些进程间通信(IPC)方法。虽然我没有多少经验,但我知道RocketBootstrap图书馆可以成为开始学习的好地方。
主要概念是您将两个不同版本的调整注入SpringBoard和UIKit应用程序。在SpringBoard中,您将运行服务器并侦听消息。在UIKit应用程序中,您将连接到此服务器并在需要在单例上执行函数时发送请求。您可以使用RocketBootstrap发送此消息。它绝对不是无缝的,因为你必须设计一个通信协议,但如果做得好,一切都会成功。
如果您需要能够将请求从SpringBoard发送到UIKit应用程序,那么您必须下载到mach_msg级别而不是使用RocketBootstrap。它仍然可以帮助你掌握你正在做的事情。