前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS开发笔记(六)

iOS开发笔记(六)

作者头像
落影
发布2018-04-27 18:01:18
8370
发布2018-04-27 18:01:18
举报

前言

专注、坚持,是优良的品格。

正文

1、cell和cell.contentView 的区别

在给UITableViewCell添加视图的时候,我们有以下两种做法:

  • [cell addSubview: subView]
  • [cell.contentView addSubview: subView]

有何不同? 先看看以下两个tableView模式的视图结构:

正常模式

编辑模式

[cell addSubview: subView]添加的subView,不会随着模式改变而改变位置;

2、Block修改外部变量

先看看一段简单的代码,看看NSLog会输出什么?代码是否存在问题?

typedef void(^TestBlock)();
@implementation ViewController {
    int a;
    NSString *b;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    a = 0;
    b = @"0";
    int c = 0;
    TestBlock block = ^() {
        a = 100;
        b = @"100";
        c = 100;
    };
    block();
    NSLog(@"%d %@ %d", a, b, c);
}

问题1:在Block中修改栈内临时变量,需要添加__block关键字声明; 问题2:在Block中修改@implementation 中声明的属性变量,也需要添加Weak-Strong的声明;

Block的执行时机未定,所以无法直接修改栈内临时变量;如果发现在栈外调用,会触发指针异常;故而需要添加__block声明,使用时把变量copy到堆上; 同理,Block可能会在VC的声明周期之外执行,所以需要在block外面添加weakSelf的声明,避免Block强引用self导致VC无法回收;同时在Block内部添加StrongSelf的声明,避免Block在执行过程中VC被回收;

在Block内外添加NSLog(@"%p %p %p", &a, &b, &c);,可以而查看调用前后的地址变化; 如果还想深入了解,可以入手一本《Objective-C高级编程 iOS与OS X多线程和内存管理》

3、多参数方法的调用

通过performSelector无法调用一个多参数的方法,可以使用NSInvocation。 首先通过instanceMethodSignatureForSelector获取NSMethodSignature,再通过invocationWithMethodSignature新建NSInvocation,最后设置好target和selector以及参数数组,最后调用invoke。

You should use the invocationWithMethodSignature: class method to create NSInvocation objects; you should not create these objects using alloc and init. 不会对参数进行retain操作,开发者要保证调用期间的参数生命周期。

这种调用方式比较复杂,如果能修改被调用的方法,可以采用把参数设置成NSDictionary或者自定义的数据结构体;也可以把方法的调用采用Block的方式。

4、Xcode 无法在Debug中输出变量信息

Xcode在真机调试时,无法通过LLDB指令打印变量信息,得到的错误信息是: Errored out in Execute, couldn't PrepareToExecuteJITExpression

  • 可能1、工程编译目标类型是release而不是debug,在target设置中改为debug;
  • 可能2、Xcode和iOS版本不一致,对齐版本;
  • 可能3、系统问题,重启电脑和iOS;
  • 可能4、打开schemes,Run选项,关闭Address Sanitizer;
5、Xcode 内存暴涨

Xcode8内存占用暴涨到60G,同时SVN占用7G多;

这个状况在今年使用SVN同步代码之后首次出现,因为SVN拉取最新的代码后Xcode会进行Index操作,怀疑是svn进程异常导致Xcode的Index逻辑异常。 在GG上查找多次,没有找到类似的问题的解决方案。 最后自己的解决办法是:打开Xcode的偏好设置,选择Account,删除Repo下面的svn库,命令行执行一遍svn cleanup,重新添加svn的Repo。

6、Core Data 真机数据查看

工作需要,想查看真机上面的CoreData的数据库数据。 真机联Xcode,打开Xcode的Devices(Shift+Command+2),下载对应App的沙盒数据。找到CoreData对应的数据库文件,一般是ProjectName.sqlite。 AppStore下载SQLPro for SQLite Read_Only,然后用其查看。

CodeReview

代码写的好不好,几个评判标准: 1、稳健性; 2、扩展性; 3、可读性; 总结一起就是,异常分支有处理,同事阅读方便,增改逻辑便捷; ** 一个对象中私有方法和公有方法的泾渭分明,并且按照具体的功能模块进行聚合,用category离散化代码;** 善用继承机制,每个VC都要有通用的VC以方便后期的统一处理; Notification的声明中,要注明发起时机,发送/接受者,参数定义; 一个单例类如果在使用中存在状态,多数情况是多个分支入口调用异步操作,如下

这种情况,最好使用闭包的回调机制,而不是采用状态。(因为单个状态在多次调用过程中会被重置,多个状态逻辑混乱)

总结

在过去的一段时间里,学习新的工作制度,融入新的环境。

一个拥有优秀的学习方法和自我控制能力的人,在每个行业都能焕发出自己的光彩。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.05.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
    • 1、cell和cell.contentView 的区别
      • 2、Block修改外部变量
        • 3、多参数方法的调用
          • 4、Xcode 无法在Debug中输出变量信息
            • 5、Xcode 内存暴涨
              • 6、Core Data 真机数据查看
                • CodeReview
                • 总结
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档