666666

1.isKindOfClass和isMemberOfClass之间的区别

isKindOfClass用来确定一个对象是否是一个类的实例,或者是该类祖先类的实例。
isMemberOfClass只能用来判断前者,不能用来判断后者。

2.懒加载

1.懒加载概念
懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小)。所谓懒加载,写的是其get方法.
注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化
2.使用懒加载的好处:
(1)不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强
(2)每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合

#import "MyViewController.h"
@interface MyViewController ()
@property (nonatomic, strong) UILabel *label;
@property (nonatomic, strong) NSArray *array;
@end
@implementation MyViewController

- (void)viewDidLoad{
    [super viewDidLoad];
    [self change];
}
// 先get再set
- (void)change {
    NSDate *date = [NSDate date];
    [self.label setText:[NSString stringWithFormat:@"%@",[date description]]];
}
// 延迟加载
- (UILabel *)label {
    //判断是否已经有了,若没有,则进行实例化
    if (!_label) {
        _label=[[UILabel alloc]initWithFrame:CGRectMake(20, 10, 300, 30)];
        [_label setTextAlignment:NSTextAlignmentCenter];
        [self.view addSubview:_label];
    }
    return _label;
}
// array的get方法
- (NSArray *)array {
    if (_array == nil) {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"];
        _array = [[NSArray alloc]initWithContentsOfFile:path];
    }
    return _array;
}
@end

3.关于键盘

// 1.监听键盘的通知方法一
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
//  当键盘改变了frame(位置和尺寸)的时候调用
- (void)keyboardWillChangeFrame:(NSNotification *)note
{
    // 设置窗口的颜色
    self.view.window.backgroundColor = self.tableView.backgroundColor;
    
    // 0.取出键盘动画的时间
    CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    
    // 1.取得键盘最后的frame
    CGRect keyboardFrame = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    
    // 2.计算控制器的view需要平移的距离
    CGFloat transformY = keyboardFrame.origin.y - self.view.frame.size.height;
    
    // 3.执行动画
    [UIView animateWithDuration:duration animations:^{
        self.backgroundView.transform = CGAffineTransformMakeTranslation(0, transformY);
        self.view.transform = CGAffineTransformMakeTranslation(0, transformY);
    }];
}

// 2.监听键盘的通知方法二
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(beginEditText:) name:UITextFieldTextDidBeginEditingNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endEditText:) name:UITextFieldTextDidEndEditingNotification object:nil];
- (void)beginEditText:(NSNotification *)notification{
    NSLog(@"开始编辑");
    CGRect frame = self.backgroundView.frame;
    frame.origin.y -= 258;
    self.backgroundView.frame = frame;
}
- (void)endEditText:(NSNotification *)notification{
    NSLog(@"结束编辑");
    CGRect frame = self.backgroundView.frame;
    frame.origin.y += 258;
    self.backgroundView.frame = frame;
}

// 3. 几个常量
 UIKeyboardAnimationCurveUserInfoKey = 7;  // 动画的执行节奏(速度)
 UIKeyboardAnimationDurationUserInfoKey = "0.25"; // 键盘弹出\隐藏动画所需要的时间
 UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 216}}";
 UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 588}";
 UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 372}";
 UIKeyboardFrameChangedByUserInteraction = 0;
 
 // 键盘弹出(隐藏)
 UIKeyboardFrameBeginUserInfoKey // 键盘刚弹出(隐藏)那一刻的frame
 UIKeyboardFrameEndUserInfoKey   // 键盘弹出(隐藏)完毕后的frame

4.SEL的简单总结

SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法。在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就可以找到对应的方法地址,进而调用方法。

给自定义view添加点击事件
@interface MyButton : UIView
@property(nonatomic,assign)id target;
@property(nonatomic,assign)SEL action;
// target:目标button执行哪一个类的方法,对应的目标就是那个类的对象
// action:动作,让button具体做什么事,执行的方法就是对应的动作
- (void)addNewTarget:(id)target Action:(SEL)action;

- (void)addNewTarget:(id)target Action:(SEL)action{
    // 实现对应的自定义方法,并且让两个属性来保存对应的目标和动作
    self.action = action;
    self.target = target;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    // 类把她的方法,交给MyButton来完成
    [self.target performSelector:self.action withObject:self];
}

初始化一个myButton
[myButton addNewTarget:self Action:@selector(click:)];

5.UINavigationBar小结

// 1.设置导航栏的标题
self.navigationItem.title = @"UINavigationBar使用总结";
// 2.通过barTintColor来设置背景色       
self.navigationController.navigationBar.barTintColor = [UIColor redColor];
// 3.设置返回按钮的颜色
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
// 4.设置返回按钮的图片
- (void)setBackButtonWithImage {
    UIImage *leftButtonIcon = [[UIImage imageNamed:@"LeftButton_back_Icon"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];    
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:leftButtonIcon style:UIBarButtonItemStyleBordered target:self action:@selector(goToBack)];
    // 修复navigationController侧滑关闭失效的问题
    self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
}
UIImageRenderingModeAlwaysOriginal 表示总是用原图渲染,如果不这么设置,返回按钮将会显示tintColor的颜色(默认为蓝色)。UITabbarItem也存在同样地问题。我们自己设置返回按钮,会导致系统的侧滑关闭效果失效。添加上面代码中最后一句代码即可修复。
// 5.隐藏导航栏底部的线条方法一
UINavigationBar *navigationBar = self.navigationController.navigationBar;
//设置透明的背景图,便于识别底部线条有没有被隐藏
[navigationBar setBackgroundImage:[[UIImage alloc] init]
                   forBarPosition:UIBarPositionAny
                       barMetrics:UIBarMetricsDefault];
// 此处使底部线条失效
[navigationBar setShadowImage:[UIImage new]];
// 6.隐藏导航栏底部的线条方法二
self.navigationController.navigationBar.clipsToBounds = YES;
// 7.设置导航栏底部线条颜色
UINavigationBar *navigationBar = self.navigationController.navigationBar;
[navigationBar setBackgroundImage:[[UIImage alloc] init]
                   forBarPosition:UIBarPositionAny
                       barMetrics:UIBarMetricsDefault];
// 此处使底部线条颜色为红色, 调用如下颜色转图片的代码
[navigationBar setShadowImage:[self imageWithColor:[UIColor redColor]]];

// 颜色转图片的代码:
- (UIImage *)imageWithColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}

6.将字符串进行MD5加密,返回加密后的字符串。MD5加密算法多数用于验证,比如说密码匹配用的就是MD5加密后得到的数值。

import <CommonCrypto/CommonDigest.h>

-(NSString *)md5:(NSString *)str {
    const char *cStr = [str UTF8String];//转换成utf-8
    unsigned char result[16];//开辟一个16字节(128位:md5加密出来就是128位/bit)的空间(一个字节=8字位=8个二进制数)
    CC_MD5( cStr, strlen(cStr), result);
    /*
     extern unsigned char *CC_MD5(const void *data, CC_LONG len, unsigned char *md)官方封装好的加密方法
     把cStr字符串转换成了32位的16进制数列(这个过程不可逆转) 存储到了result这个空间中
     */
    return [NSString stringWithFormat:
            @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
            result[0], result[1], result[2], result[3],
            result[4], result[5], result[6], result[7],
            result[8], result[9], result[10], result[11],
            result[12], result[13], result[14], result[15]
            ];
    /*
     x表示十六进制,%02X  意思是不足两位将用0补齐,如果多余两位则不影响
     NSLog("%02X", 0x888);  //888
     NSLog("%02X", 0x4); //04
     */
}

常用博客

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

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,682评论 0 9
  • 把网上的一些结合自己面试时遇到的面试题总结了一下,以后有新的还会再加进来。 1. OC 的理解与特性 OC 作为一...
    AlaricMurray阅读 2,546评论 0 20
  • 前言:面试笔试都是必考语法知识点。请认真复习和深入研究OC。 目录:iOS-面试题-OC基础篇 (1) - (84...
    麦穗0615阅读 4,249评论 0 33
  • OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性...
    小楼昨夜有风雨阅读 564评论 0 0
  • OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性...
    克鲁德李阅读 446评论 0 0