杂记

作者: ProgressChen | 来源:发表于2016-11-13 12:05 被阅读17次

    基础

    • 三目运算符

    ?:

    NSString *test = @"test";
    NSString *result = test?:@"fail";//result = @"test",当test为真时使用test值。
    

    网络相关

    User Agent

    User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

    acceptableContentTypes

    在网络response中会有“content type”在响应头中,如图:


    responseHeader.png

    content types用来标记网络响应的包的格式,此图中数据为JSON格式,可以按照这种格式进行数据解析。
    在AFNetworking中默认的使用”AFJSONResponseSerializer“对responseSerializer进行初始化。

    self.responseSerializer = [AFJSONResponseSerializer serializer];
    

    所以,默认可响应的数据格式有3种“application/json", "text/json","text/javascript",如果想增加其他格式需要向acceptableContentTypes中添加即可。

    + (instancetype)OSCJsonManager
    {
    
    //AFN中所有的网络请求都是由manager进行管理操作的。
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
     
    //向acceptableContentTypes中增加"text/html"格式的响应。
        manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
    
    //设置UA
        [manager.requestSerializer setValue:[self generateUserAgent] forHTTPHeaderField:@"User-Agent"];
    
        return manager;
    }
    

    用户基本信息的存储使用的NSUserDefaults

    NSUserDefaults 使用键值对将数据进行存储。

    NSUserDefualts *userDefaults = [NSUserDefaults standardUserDefaults];
    
    [userDefaults setInteger:user.ID forKey:@"ID"];  //存储ID
    [userDefaults setObject:user.name forKey:@"name"];  //存储name ,类型为NSString
    
    user.ID = [userDefaults integerForKey:@"ID"];  //获取int型
    user.name = [userDefaults objectForKey:@"name"];  //获取name ,类型为NSString
    

    2016-11-17

    坑1.网络数据刷新如何处理如上下拉刷新数据

    填坑:上下拉请求更新数据
    使用第三方的<MJExtension.h>和<MJRefresh.h>进行数据请求处理代码如下:

    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
            //上拉数据请求
        }];
        self.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
            //下拉数据请求
        }];
    

    当页面第一次显示时在viewDidLoadviewWillAppear中进行网络数据请求。

    坑2.OSCObjsViewController中 refresh方法的调用
    在此类的viewWillAppear中加入:NSLog(@"%@", [NSString stringWithUTF8String:object_getClassName(self)]); 查看一下继承此类时会不会自动调用此方法。

    在tableViewController中,拖动cell滚动时会不是调用scrollViewDidScroll方法?
    会自动调用,无论是上拉还是下拉

    通知

    在视图viewWillAppear:中添加一个Observer,在视图退出时viewWillDisappear:移除观察者。

    
    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];   
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dawnAndNightMode:) name:@"dawnAndNight" object:nil];
    }
    
    - (void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:@"dawnAndNight" object:nil];
    }
    

    泛型约束

    __kindof

    只允许本类或子类,相当于参数约束,如:
    如说一个NSArray<UIView >,如果不加__kindof
    ,这个数组只能有UIView,即便是其子类也不行。而加了的话NSArray<__kindof UIView >,传入UIView的子类也是可以的,如UIImageView,UIButton等UIIView的子类都适用。

    __typeof

    在新的写法中已经将__typeof替换成了typeof()

    • typeof()属于一元操作符。类似于sizeof()
    • 可以根据typeof()括号里面的变量,自动识别变量类型并返回该类型。

    typeof的使用

    在iOS中的使用,常见运用于Block 。
    下面看一个典型的用法:
    __block typeof(self) bself = self;
    [self methodBlock:^ {
    [bself doSomething];
    }
    代码解释:定义一个和self相同数据类型的bself ,并赋值为self,在block中使用
    
    

    神奇的宏

    YYKit定义了以下2个宏

    @weakify(self) & @strongify

    // @weakify(self)
    #define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object;
    
    //@strongify
    #define strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object;
    
    

    @weakify(self)展开后:__weak __typeof__(self) weak_self = self;进一步的剖析__typeof__(self)根据self的类型返所属类,进一步简化__weak CLASS weak_self = self;这就容易理解多了,相当于定义了一个弱引用类型的self。

    @strongify(self)最中展开后CLASS self = weak_self; 将self变成了弱引用类型了。

    @strongify一定于@weakify成对儿使用,一般多用于block中如下代码:

     @weakify(self)
        [self doSomething^{
            @strongify(self)
            if (!self) return;
            ...
        }];
    

    方法

    respondsToSelector

    判断是否实现了某方法。
    

    init

    • 在对某个视图控制器进初始化时[xxxViewController alloc] init]方法时,会自动调用initWithNibName: bundle:方法。

    2016-12-20

    tableView cell高度

    默认cell高度是44, 定高cell建议使用self.tableView.rowHeight = 88;,针对可变的cell高度可以在UITableViewDelegate中实现:
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // return xxx}
    需要注意的是,实现了这个方法后,rowHeight
    的设置将无效。所以,这个方法适用于具有多种 cell 高度的 UITableView。

    参考链接

    相关文章

      网友评论

          本文标题:杂记

          本文链接:https://www.haomeiwen.com/subject/plzxuttx.html