Last active
January 6, 2019 20:34
-
-
Save TPAKC/fa9d39037064e44fceb60493ff643436 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Objective-C — компилируемый объектно-ориентированный язык программирования корпорации Apple, построенный на основе языка Си и парадигм | |
Smalltalk. ObjC был создан Брэдом Коксом в начале 1980х в его компании Stepstone. | |
Структура именования файлов: файлы с расширением - h являются заголовками с описанием классов, функций также как в С и С++, | |
файлы с расширением - m соответственно содержат реализацию классов и методов. | |
NSobject – родительский класс Objectiv-C | |
Для обозначения объектов используется специальный тип id. Переменная типа id фактически является указателем на произвольный объект. | |
*/ | |
//Объявление класса создается в заголовочном файле с расширением .h и использует синтаксис: | |
//Контроллер отвечает за организацию диалога между моделью и представлением. | |
@interface имя_класса : super_Class | |
{ | |
объявление переменных; (имеют зону видимости private) | |
} | |
объявление методов; | |
@end | |
//Класс | |
Файл first.h | |
#import <Cocoa/Cocoa.h> | |
@interface first : NSObject | |
{ | |
int a; | |
int b; | |
} | |
- (id)init; | |
- (void)setA :(int)A andB :(int)B; | |
- (long)summa; | |
- (long)mul; | |
@end | |
//Реализация класса создается в файле с расшерением .m и использует синтаксис: | |
#import "имя_класса.h" | |
@implementation имя_класса | |
реализация методов; | |
@end | |
//Создание и инициализация объекта класса в ASAppDelegate: | |
ASStudent* studentA = [[ASStudent alloc] init]; | |
studentA.name = @"Bakay Alexander"; | |
//Переопределение сеттера: | |
- (void) setName: (NSString *) inputName { | |
~~~~~~~~~~~~~~~~~~~~ | |
_name= inputName | |
} | |
//Переопределение геттера: | |
- (NSString) name { | |
~~~~~~~~~~~~~~~~~~~ | |
return_name; | |
} | |
//Переопределение сеттера и геттера вместе возможно лишь при: | |
@synthesize _name | |
//Инкапсуляция свойств в .m: | |
@interface ASBoxer () | |
//Свойства: | |
@property (assign, nonatomic) NSInteger nameCount; | |
@end | |
/* Атрибуты свойств: | |
1. Атрибуты доступности (readonly-только чтение/readwrite-чтение и зипась) | |
2. Атрибуты владения: | |
retain - старая штука, когда не было ARC вместо strong использовали, сейчас нет смысла | |
strong - не уничтожается | |
copy - | |
assign-после уничтожения ссылается на пустую ссылку(возможен креш) | |
unsafe_unretained - | |
weak -после уничтожения становится nil, при вызове будет всегда выдавать отрицательный ответ), | |
3. Атрибут атомарности (atomic(многопоточное но медленее)/nonatomic(однопоточное но быстрее)). | |
4. Nullability атрибут (null_unspecified/null_resettable/nullable/nonnull) | |
*/ | |
//Примитивные типы(правильное их написание): | |
BOOL, NSInteger, NSUInteger, CGFloat, double | |
sizeof(intVar)//узнать размер переменной байтах | |
//Строки сравниваются так: (не через ==) | |
[text isEqual:@"String 1"]//true\false | |
//Массивы: | |
NSArray* array = [[NSArray alloc] initWithObjects:@"String 1", @"String2", @"String3", nil]; | |
//Вывод массива: | |
for(int i=0; i< [array count]; i++) { | |
NSLog(@"%@, [array objectAtIndex:i]); | |
} | |
//Или: | |
for(NSString* string in array) { | |
NSLog(@"%@, string); | |
} | |
//Самые популярные структуры | |
//(овокупность переменных, объединенных одним именем, предоставляющая общепринятый способ совместного хранения информации) | |
CGPoint point;//точка | |
point.x = 1.5f; | |
point.y = 2; | |
//либо: | |
point = CGPointMake(1.5f , 2); | |
CGSize size;//размер | |
size.width = 30; | |
size.height = 15; | |
//либо: | |
size = CGSizeMake(30 , 15); | |
CGREct rect;//прямоугольник | |
rect.origin = point; | |
rect.size = size; | |
//либо: | |
rect = CGRectake(1.5f , 2, 30, 15); | |
//Для создания массива из раличных типов нужно всех их сделать объектами и уже делать массив объектов | |
BOOL boolVar = YES; | |
NSInteger intVar = 10; | |
double doubleVar = 2.5f; | |
NSNumber* boolObject = [NSNumberWithBool:boolVar]; | |
NSNumber* intObject = [NSNumberWithInteger:intVar]; | |
NSNumber* doubleObject = [NSNumberWithDouble:doubleVar]; | |
NSNumber* array = [NSArray arrayWithObjects:boolObject,intObject,doubleObject,nil] | |
NSLog(@"boolVar= @d, intVar= @d, doubleVar= @f", | |
[[array objectATIndex:0] boolValue], | |
[[array objectATIndex:1] integerValue], | |
[[array objectATIndex:2] doubleValue]); | |
//Структуру как объект нельзя делать, но есть метод обволакивающий структуру как объект: | |
value = [NSValue valueWithCGPoint: (CGPoint)]; | |
//Достаем: | |
CGPoint p = [value CGPointValue]; | |
/* Список требований или предложений для вашего класса, который объект класса должен выполнять | |
Required - обязательные требования | |
Optional - не обязательные требования | |
Протокол создается как обычный класс(но при выборе типа созданного файла выбираем Protocol) | |
Мы говорим что класс будет выполнять требования протокола: в .h/* | |
@interface ASDeveloper : NSObject <ASPatient> | |
В хедерах классов теперь методы и переменные протокола объявлять не нужно, но в имплементаторе Required обязаны бытьЕ | |
*/ | |
0 + arc4random() % 10//рандом 0-9 | |
#pragma mark - Metka //Закладка в коде | |
//Dictionary - массивы, вместо id-шников у которых ключи(по которым удобно искать) - порядок в них рандомный | |
NSDictionary* dictionary = [[NSDictionary alloc] initWithObjectsAndKeys: | |
@"Petrov", @"lastName", | |
@"Vasiliy", @"name", | |
[NSNumber numberWithInt:25], @"age" | |
nil]; | |
NSLog(@"%@", dictionary); // Вывод на экран: | |
//lastName = Petrov | |
//name = Vasiliy | |
NSLog(@"name = %@, age = %d ", [dictionary objectForKey:@"name"], [[dictionary objectForKey:@"age"]integerValue]); | |
//Селектор - указатель на метод(имя метода) | |
SEL aSelector = @selector(methodName); | |
-(void) TestMethod:(NSString*) string parametr2:(NSString*) string2; | |
//Блок - объект, который "сохраняет" себе кусок кода из определенного метода, который нужно будет прогонять несколько раз | |
int xx = 21; | |
int (^myBlock)(int) = ^(int num) { | |
return num * xx; | |
}; | |
printf("%d", myBlock(2));// Напечатает "42" | |
//чтобы менять переменные в самом блоке: | |
__block NSInteger xx = 21; | |
/*Objective-C поддерживает многопоточность в приложениях. Проблемы могут возникнуть если два и более потока решат | |
одновременно модифицировать одни и те-же данные экземпляра класса. Чтобы избежать данных коллизий необходимо | |
синхронизировать потоки во время изменения критических значений переменных*/ | |
//То что хотим в фоне сделать, когда будет свободная память: | |
[self performSelectorInBackground:@selector(Method) withObject:nill]; | |
NSNotFound = 2^32;//Не найдено число | |
/*Битовые операции: | |
0&0=0 0&1=0 1&1=1 И | |
0^0=0 0^1=1 1^1=0 Исключающее ИЛИ | |
0|0=0 0|1=1 1|1=1 ИЛИ | |
~0=1 ~1=0 Инверсия | |
*/ | |
/*Исключения: | |
@try - Определяет блок кода, который является областью обработки исключений: код, который потенциально может вызвать исключение. | |
@catch() - Определяет блок, содержащий код для обработки исключения в @try блоке. | |
@finally - Определяет блок кода, который будет выполнен в любом случае, было возбуждено исключение или нет. | |
@throw - Возбуждает исключение, эта директива практически идентична в поведении методу raise NSException. | |
Пример:*/ | |
myObj* my=[[myObject alloc] init]; // создали какой либо свой объект | |
@try { | |
NSException *e = [NSException | |
exceptionWithName:@"FileNotFoundException" | |
reason:@"File Not Found on System" | |
userInfo:nil]; // Создали объект класса NSException | |
@throw e; // возбудили исключение | |
} | |
@catch(NSException *e) { | |
@throw; // перевозбудили e исключение | |
} | |
@finally { | |
[myObj release];// освободили свой объект вне зависимости от исключения | |
} | |
//Маски создаются при помощи: (c.h) | |
typedef enum{ | |
BAStudentSubjectTypeBiology = 1 << 0; | |
BAStudentSubjectTypeMath = 1 << 1; | |
BAStudentSubjectTypePhysical = 1 << 2; | |
BAStudentSubjectTypeAnatomy = 1 << 3; | |
} BAStudentSubjectType; | |
//Объявление маски: (c.h) | |
@property (assign, nonatomic) BAStudentSubjectType name; | |
//Заполнение маски:(appDel.m) | |
className.StudentSubjectType = BAStudentSubjectTypeBiology | BAStudentSubjectTypePhysical; | |
//Узнать 1\0 значение? (c.h) | |
if(self.StudentSubjectType & BAStudentSubjectTypeBiology)==true; | |
if(self.StudentSubjectType & BAStudentSubjectTypeAnatomy)==false; | |
//Переменные типа Дата | |
NSDate* date = [NSDate date]; //равно нынешней дате\времени | |
NSDateFormatter dateFormatter = [NSDateFormatter alloc] init]; | |
[dateFormatter setDateFormat:@"yyyy/MM/dd"] | |
//Вывод: yyyy-год, MM - месяц, dd-день месяца, DD-день года, EEE - название дня недели, W-неделя месяца, w - неделя года, | |
//hh-часы, mm-минуты, a - секунды, SS-милисекунды | |
NSLog(@"%@",[dateFormatter stringFromDate: date]); | |
//MVC(Model View Controler) - концепция, чтоб наш код был понятен для всех Model->Controler; View->Controler; Model|Controler | |
-(void) loadView { | |
//*** | |
//*** | |
[super loadView];//Вызов родительского класса - запуска экрана | |
//*** | |
//*** | |
} | |
UIView* view = [[Uiview alloc] init with fRame:CGRectMake(100,100,200,50)];//Создание вьюхи | |
view.backgroundColor = [UIColor redColor];//Задаем цвет фона новой вьюхи | |
[self.view addSubview:view]; //Добавляем новую вьюжку как вложенную | |
//Superview -главная вьюха, Subview - та которая на ней лежит | |
//Поначалу все положения жесткие, нужно изменять свойства autoresizingMask | |
//view1.autoresizngMask = UIViewAutoresizng... | |
None //стандартно | |
Flexible // LeftMargin - указываешь какое расстояние до стенки экрана будет жестким и не будет меняться | |
// Width\Height - ширина\высота остается прежней, можно объединять через | | |
//IBOutlets - для соверешения действия создание свойства в BAViewController.h c помощью двух окошек(кода и вьюшки) и тащим с вьюхи ПКМ ниже интерфейса | |
//frame - положение вьюхи относительно её родителя, bounds - её собственная система координат | |
[UIView animateWithDuration:5 //Время анимации | |
delay:1 //задержка | |
options: UIViewAnimationOptionCurveEaseIn; | |
animations:^{//Сама анимация | |
self.view.center = CGPointMake(CGRectGetWidth(self.view.bounds)-CGRectGetWidth(self.view.frame) / 2, 150); | |
//вьюха будет передвигаться с своей позиции до указаной позиции за 5 секунд | |
} | |
completion:^(BOOL finished){ //Что произойдет в конце анимации | |
NSLog(@"animation finished! %d", finished); | |
}]; | |
/*Обсерверы*/ | |
[student addObserver:self //student - объект класса | |
forKeyPath:@"name" //Ждем изменения параметра "name" | |
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld //Получаем новое\старое значение | |
context:NULL];//Ненужная шняга))) | |
- (void)observeValueForKeyPath:(NSString *)keyPath //Должен быть данный метод в AppDelegate | |
ofObject:(id)object | |
change:(NSDictionary *)change | |
context:(void *)context | |
{ | |
//Здесь действия который должны проходить при изменении | |
} | |
/*Ключи*/ | |
[student setValue:"Roger" forKey:@"name"]//В объекте "student" изменеяем параметр "name" на значение "Roger" | |
NSLog(@"%@", [student valueForKey:"name"]);//Получаем параметр "name" объекта "student" | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment