0

我的问题是我想在 SpringBoard、Safari、Settings、Notes 等应用程序中使用一个对象。我使用的是单例模式。但是当我转储这些对象时,它们有自己的分配。因此,我认为它们是不同的对象。有没有办法让对象在应用程序中保持活动状态?我有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>

我的类.h

#import <Foundation/Foundation.h>

@interface MyClass : NSObject

+ (instancetype)sharedInstance;
- (void)doSomething;

@end

我的班级.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

调整.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
4

2 回答 2

0

每个进程都有自己的变量副本,因为这是进程在 iOS 中的工作方式(而不仅仅是在 iOS 中)。每个进程都有自己独立的内存,它们之间根本不共享数据。因此,您的单例将为每个进程单独构建。

于 2014-10-20T10:37:36.230 回答
0

如果你想使用同一个对象,你将不得不开发一些进程间通信(IPC)的方法。虽然我没有太多经验,但我知道RocketBootstrap库是开始学习的好地方。

主要概念是您将两个不同版本的调整注入 SpringBoard 和 UIKit 应用程序。在 SpringBoard 中,您将运行一个服务器并监听消息。在 UIKit 应用程序中,您将连接到该服务器并在您需要在单例上执行功能时发送请求。您可以使用 RocketBootstrap 发送此消息。这绝对不是无缝的,因为你必须设计一个通信协议,但如果做得好,一切都会好起来的。

如果您需要能够从 SpringBoard 向 UIKit 应用程序发送请求,则必须下拉到 mach_msg 级别,而不是使用 RocketBootstrap。但是,它仍然可以帮助您掌握正在做的事情。

于 2014-10-21T07:34:14.600 回答