近期总结

来源:互联网 发布:php充值提现网站源码 编辑:程序博客网 时间:2024/05/23 02:03

最近没什么时间写(好吧太懒了)

  • addSubview的参数放在一个”({})”代码块中,而view的创建及属性设置都放在”({})”完成,代码块最后一句即我们要添加的子view。
    这种写法沿用了GNU C的一个特性,即复合语句(compound statement)。即在”({})”代码块中,我们可以放置多个语句,这些语句可以是循环、分支、变量声明、函数调用等。而复合语句的最后一句是一个表达式,其作为整个复合语句的最终值。
    在写Objective-C代码时,使用复合语句能让我们的代码变得更优雅,特别是创建并添加一堆子view时,能让我们的代码看上去更整洁。建议经常使用。详情
  • 不要用NSLog输出来查看NSDate,NSDate本身存的就是UTC时间(无论你怎么换timeZone都不会有变化),可以将NSDate转换为string来查看,所以你用CST换成GMT就是ok的,(格林尼治时间已经不再被作为标准时间使用。现在的标准时间——协调世界时(UTC)——由原子钟提供),更多信息可以查看文档,可以用下列代码打印查看具体的情况
for (NSString *timeZone in [NSTimeZone knownTimeZoneNames]) {       [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:timeZone]];        NSDate *currentDateStr = [dateFormatter dateFromString:@"Thu Aug 04 02:47:40 CST 2016"];        NSString *dateString = [dateFormatter stringFromDate:currentDateStr];        NSLog(@"date:%@,string:%@",currentDateStr,dateString);    }

简单地址筛选页面总结

  • 需要用到的知识点 NSCharacterSet NSPredicate

  • 数据方面Excel 复制excel内容到txt然后使用文本写个方法获得plist

    NSString *citysPath = [[NSBundle mainBundle] pathForResource:@"citys" ofType:@"txt"];    // 获得所有的string    NSString *citysContent = [[NSString alloc] initWithContentsOfFile:citysPath encoding:NSUTF8StringEncoding error:nil];    //  按行分    NSArray *citysArray = [citysContent componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];    // 创建plist路径    NSString *plistPath = [NSHomeDirectory() stringByAppendingPathComponent:@"city.plist"];    NSMutableArray *resultsArr = [NSMutableArray array];    for (NSInteger j = 0; j < citysArray.count; j++){        NSString *cityStr = [citysArray objectAtIndex:j];        // 按空格分        NSArray *cityArr = [cityStr componentsSeparatedByString:@"\t"];        // 每行创建一个字典对应        [resultsArr addObject:@{@"cityName":[cityArr objectAtIndex:0],                                @"cityNum":[cityArr objectAtIndex:1],                                @"communityName":[cityArr objectAtIndex:2],                                @"communityNum":[cityArr objectAtIndex:3],                                @"begin_chr":[cityArr objectAtIndex:4]}];    }    // 写入plist 原子性    [resultsArr writeToFile:plistPath atomically:YES];    // 复制plist路径把Plist取出放进项目中 0.0    NSLog(@"%@",plistPath);
  • 创建Model
@interface WHBKCityModel : NSObject@property (nonatomic,strong) NSString *begin_chr;@property (nonatomic,strong) NSString *cityName;@property (nonatomic,strong) NSString *cityNum;@property (nonatomic,strong) NSString *communityName;@property (nonatomic,strong) NSString *communityNum;@end
  • 写成单例
    static WHBKCitys *citys;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        citys = [[WHBKCitys  alloc] init];        // 使用的MJExtension转换成对象数组        citys.citys = [WHBKCityModel  objectArrayWithFilename:@"city"];        NSMutableArray *arrs = @[].mutableCopy;        NSMutableArray *cityArr = citys.citys.mutableCopy;        for (int i = 'A'; i < 'Z'+1 ; i++) {            NSMutableArray *arrs1 = @[].mutableCopy;            for (WHBKCityModel *model in cityArr) {                 const char *c = [model.begin_chr UTF8String];                if (*c == i) {                    [arrs1 addObject:model];                }            }            [cityArr removeObjectsInArray:arrs1];            [arrs addObject:arrs1.copy];        }        citys.initialArrays = arrs.copy;    });    return citys;}
  • 对应创建一个根据名称筛选的方法和根据名称获取model的方法
- (NSArray *)filterWithName:(NSString *)name{    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"cityName CONTAINS %@",name];    NSArray *filters = [_citys filteredArrayUsingPredicate:predicate];    return filters;}- (WHBKCityModel *)getModelUseFullName:(NSString *)fullName{    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"cityName == %@",fullName];    NSArray *filters = [_citys filteredArrayUsingPredicate:predicate];    return filters.firstObject;}
  • tableView方面增加了一个sectionTitles方法,右侧显示对应sectionTitle
- (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView 
  • 用到了UISearchBar关于cancelButton改变颜色等等,因为跟UI冲突就没有用到searchController

笔记:

记录下容易忘记的点
* 在纯c中,如果想访问分配在栈上的结构体里面的成员,也需要使用类似的语法
* @dunamic不会自动创建setter,getter
* weak属性并不会保留新值也不会释放旧值,不会增加引用计数器,当此属性所指的对象遭到摧毁,属性值也会自动置为nil
* 使用NSString,NSDictionary,NSSet,NSAttributeString等可变的对象时,最好使用copy特质来保护对象的封装性,以免mutable类型乱入
* 直接使用实例变量去访问属性,如copy,那么并不会copy一份,只会保留新值释放旧值
* 直接访问实例变量不会出发KVO
* 在初始化中应该直接访问实例变量,因为可能会“重写”setter方法,那样就会出事!
* 初始化及dealloc方法中,应该直接通过实例变量来读写数据

objc_getAssociatedObject(<#id object#>, <#const void *key#>)    objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)
* oc消息机制```OBJC_EXPORT void objc_msgSend(void /* id self, SEL op, ... */ );objc_msgSend_stret();// 如果待发送的消息要返回结构体objc_msgSend_fpret();// 返回浮点数objc_msgSendSuper();// 发送给超类// message forwarding当对象接受到无法解读的消息后 首先调用+ (BOOL)resolveInstanceMethod:(SEL)sel该方法的参数就是未知的selector,返回值是bool,表示这个类是否能新增一个实例去处理如果是类方法则会调用+ (BOOL)resolveClassMethod:(SEL)sel当调用上述方法无果,则会有第二次机会去处理,转移给其他接受者- (id)forwardingTargetForSelector:(SEL)aSelector如果再无果,则调用- (void)forwardInvocation:(NSInvocation *)anInvocation(NSInvocation)[http://www.jianshu.com/p/03e7279a9916]如果都不行 则调用- (void)doesNotRecognizeSelector:(SEL)aSelector并抛出异常```* 在类继承体系中查询类型信息```- (BOOL)isKindOfClass:(Class)aClass 判断出对象是否为某类或其派生类的实例- (BOOL)isMemberOfClass:(Class)aClass 判断出对象是否为某个特定类的实例想上述这样的类型查询方法使用isa指针获取对象所属的类,然后通过super_class指针在继承体系里面继续查询```* 类对象是singleton 在应用程序内,仅有一个Class instance```精准判断出对象是否为某类实例的办法是:BOOL isSame = [self.view class] == [UIView class];```即使这样也应该尽量使用类信息查询方法,而不是直接比较两个类对象是否相同,因为前者可以正确处理那些使用了msgforwarding机制的对象,比方说某个对象可能会把其手到的所有selector都转发给另外一个对象,这样的对象叫做proxy,此种对象以NSProxy为基类###第三章 接口与api design* oc没有namespace机制 所以尽量类名加前缀* 一般前缀都是三个字母(两个字母的被apple拿去了)* 除了类名之外 即使在.m文件中,声明全局变量、函数,变量名或函数名都会被加入到top-level symbol列表中,可以设置为static或者加前缀,视具体情况而定* 提供指定的初始化器 designated initializer,其他初始化方法都会来调用指定的初始化的方法* 一般都很少实现description方法* 注意使用readonly ,但是读写的话,一般不会去写readwrite...* 方法名称要清晰* 为私有方法加前缀,一般都是加p_进行标记,D_标记代理,A_代表action类* NSException用于严重错误(fatal error),如果是小错误,可以使用NSError,给别人用则可以使用断言NSAssert ,try catch 捕捉的异常太简单了一般用的很少* 理解NSCopying协议与NSMutableCopying```- (id)copyWithZone:(NSZone *)zone- (id)mutableCopyWithZone:(NSZone *)zone```* 这里为我们解释了NSZone,因为以前开发程序时,会根据此把内存分成不同的区,而对象会创建在某个区里面,现在不用了,每个程序只有一个default zone```- (id)copyWithZone:(NSZone *)zone{SQLViewController *copy = [[[self class] allocWithZone:zone] init];// 对属性进行赋值return copy;}```* 对于collection类要进行深copy需要依赖collection自带的方法```initWithArray:<#(nonnull NSArray *)#> copyItems:<#(BOOL)#>```* 对已回收的对象发送消息是不全的,所以一般可以开启NSZombieEnable来检测,开启后运行期会把所有已经回收的实例转化为特殊的”僵尸对象”,这种对象所在的核心内存无法重用,因此不可能遭到覆写,僵尸对象接受到消息后会抛出异常* 定义block,global block,stack block, malloc block* 定义block的时候,其所占的内存区域是分配在栈中的,这就是说,block只在定义它的那个范围内有效* dispatch_group简介* 创建dispatch_group可以通过`dispatch_group_t group = dispatch_group_create();`

that’s all~

0 0
原创粉丝点击