Skip to content

Instantly share code, notes, and snippets.

@TPAKC
Last active January 6, 2019 20:34
Show Gist options
  • Save TPAKC/fa9d39037064e44fceb60493ff643436 to your computer and use it in GitHub Desktop.
Save TPAKC/fa9d39037064e44fceb60493ff643436 to your computer and use it in GitHub Desktop.
/*
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