概念解析

1 super、superClass、class
  • self -> 当前对象
    class:获取当前方法调用者的类。
    superClass:获取当前方法调用者的父类。

  • super:仅仅是一个编译器指示器,就是给编译器看的,不是一个指针。
    本质:只要编译器看到super这个标志,就会让当前对象去调用父类方法,本质还是当前对象在调用。

NSLog(@"%@ %@ %@ %@",[self class], [self superclass], [super class], [super superclass]);
2 添加文件未加入勾选target以及重复编译问题
Snip20191223_1.png
Snip20191223_2.png
Snip20191223_3.png
3 const

1 const与宏区别
宏:常用字符串,常见基本变量
const:苹果推荐使用方式,而不是宏

const与宏的区别

  • 编译时刻不同:宏:预编译 const:编译
  • 编译时刻:宏没有编译检查,const有编译检查
  • 宏的好处:定义函数,方法,const不可以
  • 宏的坏处:大量使用宏,会导致预编译时间过长

2 const基本使用

  • 用于修饰右边的基本变量(int a)或者指针变量(int *p)
  • 被const修饰的变量只读
//修饰基本变量: 两种方式效果一样
const int a = 3
int const a = 3
// 修饰指针变量
int b = 3
int * const p = &a;
int c = 4;
p = &b; //会报错
int const *q = &a;
*q = 5; // 会报错
int * const p; // *p:变量 p:只读
int const *p1; // *p1:只读  p1:遍历
const int *p2; // *p2:只读 p2:变量
const int * const p3; // *p3:只读 p3:只读
int const * const p4; // *p4:只读  p4:只读

3 const使用场景

  • 修饰全局变量 => 全局只读变量
  • 修饰方法中参数
NSString * const cellReuseIndentifier = @"resueCell";

// 这种方法不能在方法内部修改变量值
- (void)test:(int const *)a {
    ....
}
4 static和extern

1 static

  • 修饰局部变量,
    1.被static修饰的局部变量,延长生命周期,跟整个应用程序有关
    2.被static修饰的局部变量,只会分配一次内存
    3.被static修饰的局部变量,程序运行就会给static修饰变量分配内存
  • 修饰全局变量
    被static修饰的全局变量,作用域会修改,只能在当前文件下使用

2 extern

  • 声明外部的全局变量
    注意:extern只能用于声明,不能用于定义
  • 工作原理:先会去当前文件下查找有没有全局变量,如果没有,才会去其他文件查找
  • 全局变量也是在系统运行的时候就会分配内存

3 static和const的联合使用

  • 使用static修饰的全局变量只能在当前文件夹下使用

4 extern和const联合使用
开发规范:全局变量不能定义在自己的类中,自己创建全局文件管理全局东西。

5 通知
  • 通知顺序:通知需要先进行监听,再发送通知。
- (void)viewDidLoad {
    [super viewDidLoad];
    // 监听通知
    // name:通知名字
    // object:谁发的通知
    // queue:决定block在哪个线程执行,nil:在发布通知的线程中执行
    // usingBlock:只要监听到通知,就会执行block
    self.observer = [[NSNotificationCenter defaultCenter] addObserverForName:@"name" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
        NSLog(@"%@",[NSThread currentThread]);
    }];
    
    // 发送通知
    // 通知名字
    // 谁发的通知
    [[NSNotificationCenter defaultCenter] postNotificationName:@"note" object:nil];
}

- (void)dealloc {
    // 移除通知
    [[NSNotificationCenter defaultCenter] removeObserver:self.observer];
}
  • 发送的通知在哪个线程,那么处理通知就是在哪儿线程,但是如果使用block的方式,并且设置了队列为主队列,那么接收通知都是在主线程处理。
- (void)viewDidLoad {
    [super viewDidLoad];
    // 监听通知
    // name:通知名字
    // object:谁发的通知
    // queue:决定block在哪个线程执行,nil:在发布通知的线程中执行
    // usingBlock:只要监听到通知,就会执行block
    self.observer = [[NSNotificationCenter defaultCenter] addObserverForName:@"note" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
        NSLog(@"%@",[NSThread currentThread]);
    }];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // 发送通知
        // 通知名字
        // 谁发的通知
        [[NSNotificationCenter defaultCenter] postNotificationName:@"note" object:nil];
    });
}

- (void)dealloc {
    // 移除通知
    [[NSNotificationCenter defaultCenter] removeObserver:self.observer];
}
6 assign和weak区别
  • weak:__weak 修饰 弱指针,不会让引用计数器+1,如果指针对象被销毁,指针会自动清空,ARC才有weak
  • assign:__unsafe__unretained修饰,不会让引用计数+1,如果指向对象被销毁,指针不会清空
7 bounds和frame

frame:以父控件左上角为原点
bounds:以自己的左上角为原点

frame和bounds都是用来描述一块区域
frame:描述可视范围
bounds:描述可视范围在内容的区域
所有子控件都是相对于内容
bounds:修改内容原点

相对性:可视范围相对于父控件位置永远不变
可视范围相对于内容,位置改变

- (void)viewDidLoad {
    [super viewDidLoad];
    UIView *redView = [UIView new];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(50, 50, 200, 200);
    _redView  = redView;
    
    UISwitch *swith = [UISwitch new];
    [_redView addSubview:swith];
    
    [self.view addSubview:redView];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    CGRect bounds = self.redView.bounds;
    bounds.origin.y += 10;
    self.redView.bounds = bounds;
}

scrollView底层滑动其实就是改变其bounds

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // => 手指往上拖动,bounds y++ ,内容才会往上走
    UIView *scrollView = [[UIView alloc] init];
    scrollView.frame = self.view.bounds;
    [self.view addSubview:scrollView];
    
    UISwitch *swich = [[UISwitch alloc] init];
    [scrollView addSubview:swich];
    
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    [scrollView addGestureRecognizer:pan];

}


- (void)pan:(UIPanGestureRecognizer *)gester {
    // 获取手指偏移
    CGPoint transitonP = [gester translationInView:gester.view];
    
    // 修改bounds
    CGRect bounds = gester.view.bounds;
    bounds.origin.y -= transitonP.y;
    gester.view.bounds = bounds;
    
    // 复位
    [gester setTranslation:CGPointZero inView:gester.view];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,028评论 1 32
  • Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢。我们从下...
    奔跑吧小蚂蚁阅读 395评论 1 1
  • 几种语言的特性 汇编程序:将汇编语言源程序翻译成目标程序编译程序:将高级语言源程序翻译成目标程序解释程序:将高级语...
    囊萤映雪的萤阅读 2,775评论 1 5
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,504评论 0 38
  • 通配符与正则表达式很容易混淆,混淆的原因是它们都使用了一些特殊字符来描述满足其条件的某一类字符。但他们确实是完全两...
    罗蓁蓁阅读 386评论 0 3