Вам нужно к scp
что-то где-нибудь. Вы имеете scp ./styles/
, таким образом, Вы говорите безопасную копию ./styles/
, но не, где скопировать ее в.
Обычно, если Вы хотите загрузить, это пойдет:
# download: remote -> local
scp user@remote_host:remote_file local_file
, где local_file
мог бы на самом деле быть каталог для помещения файла, Вы копируете в. Для загрузки это - противоположное:
# upload: local -> remote
scp local_file user@remote_host:remote_file
, Если Вы хотите скопировать целый каталог, Вам будет нужно -r
. Думайте scp
так же как cp
, кроме Вас может определить файл с user@remote_host:file
, а также просто локальные файлы.
Редактирование: Как отмечено в комментарии, если имена пользователей на локальных и удаленных хостах являются тем же, то пользователь может быть опущен при определении удаленного файла.
Дополнение до двух позволяет суммировать отрицательные и положительные числа без какой-либо специальной логики.
Если вы пытались сложить 1 и -1, используя свой метод
10000001 (-1)
+00000001 (1)
вы получите
10000010 (-2)
Вместо этого, используя дополнение до двух, мы можем добавить
11111111 (-1)
+00000001 (1)
вы получите
00000000 (0)
То же самое и с вычитанием.
Кроме того, если вы попытаетесь вычесть 4 из 6 (два положительных числа), вы можете дополнить 2 до 4 и сложить два вместе 6 + (-4) = 6 - 4 = 2
Это означает, что вычитание и сложение как положительных, так и отрицательных чисел может выполняться одной и той же схемой в процессоре.
Вы упомянули контроллер панели вкладок. Если ваши контроллеры представления подключены через IB, все, что вам нужно сделать, это установить эти параметры в методе делегата приложения applicationDidFinishLaunching:
, прежде чем отобразится контроллер панели вкладок:
@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate>
{
MyDataModel *model;
AViewController *aViewController;
BViewController *bViewController;
...
}
@property (retain) IBOutlet AViewController *aViewController;
@property (retain) IBOutlet BViewController *aViewController;
@end
@implementation MyAppDelegate
...
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
...
aViewController.model = model;
bViewController.model = model;
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
}
Не забудьте отпустить модель в методе dealloc
вашего контроллера представления.
Альтернативой является использование одноэлементного объекта. Простой пример синглтона:
@interface MyDataModel : NSObject
{
}
+ (MyDataModel *) sharedDataModel;
@end
@implementation MyDataModel
static MyDataModel *sharedDataModel = nil;
+ (MyDataModel *) sharedDataModel
{
@synchronized(self)
{
if (sharedDataModel == nil)
{
sharedDataModel = [[MyDataModel alloc] init];
}
}
return sharedDataModel;
}
@end
Вы можете получить доступ к этой модели данных со всех ваших контроллеров представления с помощью чего-то вроде следующего:
MyDataModel *model = [MyDataModel sharedDataModel];
См. Также это обсуждение переполнения стека по поводу синглтонов.
, до отображения контроллера панели вкладок:@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate>
{
MyDataModel *model;
AViewController *aViewController;
BViewController *bViewController;
...
}
@property (retain) IBOutlet AViewController *aViewController;
@property (retain) IBOutlet BViewController *aViewController;
@end
@implementation MyAppDelegate
...
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
...
aViewController.model = model;
bViewController.model = model;
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
}
Не забудьте освободить модель в методе dealloc
вашего контроллера представления.
Альтернативой является использование одноэлементного объекта. Простой пример синглтона:
@interface MyDataModel : NSObject
{
}
+ (MyDataModel *) sharedDataModel;
@end
@implementation MyDataModel
static MyDataModel *sharedDataModel = nil;
+ (MyDataModel *) sharedDataModel
{
@synchronized(self)
{
if (sharedDataModel == nil)
{
sharedDataModel = [[MyDataModel alloc] init];
}
}
return sharedDataModel;
}
@end
Вы можете получить доступ к этой модели данных со всех ваших контроллеров представления с помощью чего-то вроде следующего:
MyDataModel *model = [MyDataModel sharedDataModel];
См. Также это обсуждение переполнения стека по поводу синглтонов.
перед отображением контроллера панели вкладок:@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate>
{
MyDataModel *model;
AViewController *aViewController;
BViewController *bViewController;
...
}
@property (retain) IBOutlet AViewController *aViewController;
@property (retain) IBOutlet BViewController *aViewController;
@end
@implementation MyAppDelegate
...
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
...
aViewController.model = model;
bViewController.model = model;
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
}
Не забудьте освободить модель в методе dealloc
вашего контроллера представления.
Альтернативой является использование одноэлементного объекта. Простой пример синглтона:
@interface MyDataModel : NSObject
{
}
+ (MyDataModel *) sharedDataModel;
@end
@implementation MyDataModel
static MyDataModel *sharedDataModel = nil;
+ (MyDataModel *) sharedDataModel
{
@synchronized(self)
{
if (sharedDataModel == nil)
{
sharedDataModel = [[MyDataModel alloc] init];
}
}
return sharedDataModel;
}
@end
Вы можете получить доступ к этой модели данных со всех ваших контроллеров представления с помощью чего-то вроде следующего:
MyDataModel *model = [MyDataModel sharedDataModel];
См. Также это обсуждение переполнения стека по поводу синглтонов.
Самый распространенный способ, который я видел, - это настроить то, к чему вы хотите получить доступ, в делегате приложения и ссылаться на него в других местах, например так:
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
myStuff = appDelegate.stuff;
В делегате приложения, настройте переменную материала и используйте @property и @synthesize как обычно.
Некоторые люди говорят, что это не лучший подход, поскольку он аналогичен использованию глобальных переменных, но очень распространен.
Мне нравится создавать класс модели верхнего уровня, который является одноэлементным и содержит все элементы, которые могут мне понадобиться.
Также полезно предоставить ему метод загрузки верхнего уровня, который заполняет объекты просто ключи db, используя шаблон hydrate / dehydrate, общий в примерах Apple.
Типичное использование в делегате приложения будет просто,
[[MyModel sharedModel] load];
А затем в контроллере представления:
NSArray *myThing1s = [[MyModel sharedModel] thing1s];
NSArray *myThing2s = [[MyModel sharedModel] thing2s];
Затем вы можете перебирать свои вещи и thing2s, и когда вам нужны подробности, вы можете просто вызвать
[myThing1 hydrate];
, который заполнит объект.
Конечно, вы, вероятно, захотите использовать CoreData для управления постоянством, начиная с версии 3.0.
Оба контроллера представления должны ссылаться на третий объект (C) в качестве источника данных; этот объект (C), содержащий все сохраненные данные приложения.
C в этом случае будет M в MVC.
Добавьте к каждому из ваших ViewController следующие объявления:
// SomeViewController.h
// Before @interface
@class MyDataSource;
// In the interface
IBOutlet MyDataSource *datasource;
@property(retain) IBOutlet MyDataSource *datasource;