2014-10-20 6 views
0

У меня проблема в том, что я хочу использовать объект в таких приложениях, как SpringBoard, Safari, Settings, Notes и т. Д. Я использую шаблон Singleton. Но когда я сбрасываю эти объекты, у них есть собственное выделение. Поэтому я думаю, что они разные объекты. Есть ли способ сохранить объект во всех приложениях? У меня есть разрешение root.Как сохранить объект в приложении в объекте-c

Вот мой журнал на 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

Если вы хотите использовать один и тот же объект, вам придется разработать некоторый метод межпроцессного взаимодействия (IPC). Хотя у меня нет большого опыта в этом, я знаю, что библиотека RocketBootstrap может стать хорошим местом для начала обучения.

Основная идея заключается в том, что вы вводите две разные версии вашей настройки в приложения SpringBoard и UIKit. В SpringBoard вы запустите сервер и прослушаете сообщения. В приложениях UIKit вы будете подключаться к этому серверу и отправлять запрос, когда вам нужно выполнить функцию на синглетоне. Вы можете использовать RocketBootstrap для отправки этого сообщения. Это определенно не является бесшовным, так как вам нужно разработать протокол связи, но все будет работать, если будет выполнено правильно.

Если вам нужно отправлять запросы от SpringBoard в приложения UIKit, вам нужно будет спуститься до уровня mach_msg, а не использовать RocketBootstrap. Это все равно поможет вам понять, что вы делаете.

+0

Спасибо @Ryan Pendleton. Я попробую ваше предложение. Моя проблема в том, что: мне нужно создать новый элемент управления (в данном случае это прямоугольник). Мой контроль всегда отображает верхний SpringBoard и каждое приложение. Он выглядит как AssistiveTouch на iPhone/iPod/iPad. Чтобы решить мою проблему, я создал пользовательский интерфейс UIWindow и добавил в него UIView. Но я хочу, чтобы мой элемент управления вращался, когда ориентация устройства изменилась на SpringBoard и в каждом приложении. Но с каждым приложением будет создан новый экземпляр моего пользовательского UIWindow, даже если я уже использую singleton pattern. Вот мой пользовательский интерфейс UIWindow http://pastie.org/9664645 –

+0

@MinhQuy Есть ли причина, по которой вы вводите ваши настройки в приложения? Похоже, что впрыскивать его в SpringBoard было бы достаточно, если бы не было чего-то, чего я не видел. –

+0

Существует множество способов обработки изменений ориентации устройства, но они имеют одинаковую проблему. В каждом процессе приложения (SpringBoard, Safari, Notes и т. Д.) Он создаст свой собственный объект моего пользовательского интерфейса UIWindow. Я могу повернуть новый объект, но старый объект, созданный в SpringBoard, все еще отображается, и я не могу его удалить или скрыть. Я пытаюсь обнаружить, когда SpringBoard выходит на передний план и фон. –

0

Каждое из процессов имеет свою собственную копию переменных, потому что это путь процессы работают в прошивке (и не только в прошивке по этому вопросу). Каждый процесс имеет свою собственную отдельную память, и данные вообще не разделяются между ними. Из-за этого ваш синглтон будет построен отдельно для каждого процесса.

+0

Спасибо за ответ. Я буду пытаться с другими решениями. –

+0

Привет, WojtekSurowka, я использовал NSDistributedNotificationCenter, чтобы исправить мою проблему. –