近期(2018.8-2018.11)总结

(一)使用商汤SDK踩过的坑

1、不同设备居然走的逻辑不一样,这是我们代码的坑,导致在某些iOS低系统上不能走了。

2、setHacknessThresholdScore这个值还要很大才行,一般0.99,0.5还不行。

3、大早用了线上包,导致只能用线上的bundle id,打包非常麻烦。

我的做法

1、超时没有回调怪商汤

2、我的手机正常,别的手机不正常,怪商汤怪手机有问题

3、测试打包有问题,但是我给他装没问题,怪商汤

正确思路

1、商汤固然有问题,但整体还是自己的问题

2、网上学习相关testflight文档

3、尽量少思考手机的问题,SDK的问题,可以作为最后怀疑对象

4、一步一步比较两个手机的流程,看区别

5、问朋友、同事

6、重点是看install的版本号

7、以后要慎重将bundle id 改为线上的bundle id ,打包非常麻烦

8、公开测试一定要重新构建版本

(二)简易笔记

1、切记,如果我们想要用layout,对象的创建不能用new 或者alloc 、init ,不然就会出问题。

这样出来的对象不能用layout里面的组件

2、记录修改框架的时候,我们可以记录哪个文件哪行,非常仔细的找到地方

3、微信回来打开是线上的app,不能打开调试的app,因为微信打开的是线上bundle id对应的app

(三)self.view.window研究

(1)self.view.window in viewDidLoad  (null)

print self.view.window  viewWillAppear (null)

print self.view.window  viewDidAppear<UIWindow: 0x10145f8a0; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x10145c2e0>; layer = <UIWindowLayer: 0x101464090>>

结论只有在视图加载完毕才有self.view.window,其他没有,我猜测是因为没有加到window上面

因此注意:要想拿到window通过如下的方法拿,或者待视图加载完毕后再用self.view.window加载

(2)UIWindow *window = [[UIApplication sharedApplication] delegate].window;

UIWindow *keyWindow =  [UIApplication sharedApplication].keyWindow;

是同一个window

(3)为什么在tabbar 里面的keywindow加不上广告视图,其实广告是加上了,但是被Weex的视图覆盖了,但是login vc里面没有Weex页面。是因为,往window添加东西后,后面又有vc添加到window上面,将之前的覆盖了,网window添加东西不是最后一个操作,知道吗。

(4)UIWindow *window = [UIApplication sharedApplication].delegate.window;

 UIWindow *wind = self.view.window;

如果wind有,那是同一个指针

(5)那为什么网self.view就行了呢。

WXViewController的视图,imageView ,还有其他视图一起装入容器视图。

(6)the defference between keywindow and window

They are the same in iOS, but on Mac OS they can be different, because in iOS there is only one window, while on Mac OS could be more than one. 

(四)weak的脆弱性

 __weak typeof(self) weakSelf = self;

@property(nonatomic, weak) id<***WebViewModelDelegate>delegate;

有时候这两种写法都是危险了,容易被释放,有时候要改为如下:

 __strong typeof(self) weakSelf = self;

@property(nonatomic, strong) id<***WebViewModelDelegate>delegate;

原因:

(五)自动释放池

1、可以发现objc_autoreleasePoolPush() 和 objc_autoreleasePoolPop() 这两个方法。

2、再看一下runtime 中 Autoreleasepool 的结构,通过阅读源码可以看出 Autoreleasepool 是一个由 AutoreleasepoolPage 双向链表的结构,其中 child 指向它的子 page,parent 指向它的父 page。

3、并且每个 AutoreleasepoolPage 对象的大小都是 4096 个字节。

(六)尽量不要剪切文件,要拷贝文件,最好,防止文件丢失。

(七)button 图片设置

可以压扁,但是不能扩大,图片有一个最大值,超过这个最大值,其他设置没有。

// 系统会自动计算rightCapWidth rightCapWidth = image.width - leftCapWidth - 1;

 // 系统会自动计算bottomCapHeight bottomCapHeight = image.height - topCapHeight - 1 

这好像很厉害哦,将拉伸范围缩小到这么小的范围。

可以用这个方法拉伸图片

 UIImage *image2 = [image1 imageByResizeToSize:CGSizeMake(40, 40)];//方法来自YYKit

在具体操作中,我们首先看图片是不是太小了,要不要拉伸一下,如果确实就拉伸一下,如果需要的还比实际图片尺寸还要小,那好,直接处理就行

(八)目录知识

图片来源网络 

 

Documents/

内容:可以将应用程序的数据文件保存在此目录下。不过这些数据类型仅限于不可再生的数据,可再生的数据文件应该存放在Library/Cache目录下。苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下。

iTunes和iCloud:备份到iTunes或iCloud。

Library/Caches

内容:主要是缓存文件,用户使用过程中缓存都可以保存在这个目录中。前面说过,Documents目录用于保存不可再生的文件,那么这个目录就用于保存那些可再生的文件,比如网络请求的数据。鉴于此,应用程序通常还需要负责删除这些文件。

iTunes和iCloud:不支持备份到iTunes或iCloud

(九)load initialize区别

转载:

http://blog.leichunfeng.com/blog/2015/05/02/objective-c-plus-load-vs-plus-initialize/

图片来源网络

1、这样的调用方式就使得 +load 方法拥有了一个非常有趣的特性,那就是子类、父类和分类中的 +load 方法的实现是被区别对待的。也就是说如果子类没有实现 +load 方法,那么当它被加载时 runtime 是不会去调用父类的 +load 方法的。同理,当一个类和它的分类都实现了 +load 方法时,两个方法都会被调用。因此,我们常常可以利用这个特性做一些“邪恶”的事情,比如说方法混淆(Method Swizzling)。

(十)hopper

查hopper是什么

1、调用栈(英语: Call stack,英文直接简称为”栈”(the stack))别称有:执行栈(execution stack)、控制栈(control stack)、运行时栈(run-time stack)与机器栈(machine stack),是计算机科学中存储有关正在运行的子程序的消息的栈。有时仅称为”栈’,但栈中不一定仅存储子程序消息。几乎所有的计算机程序都依赖于调用栈,然而高级语言一般都将调用栈的细节隐藏至后台。

2、调用栈最经常被用于存放子程序的返回地址。在调用任何子程序时,主程序都必须暂存子程序运行完毕后应该返回到的地址。因此,如果被调用的子程序还要调用其他的子程序,其自身的返回地址就必须存入调用栈,在其自身运行完毕后再行取回。在递归程序中,每一层次递归都必须在调用栈上增加一条地址,因此如果程序出现无限递归(或仅仅是过多的递归层次),调用栈就会产生栈溢出。 (百度百科)

(十一)初始化方法注意

- (instancetype)initWithViewHeight:(CGFloat)viewHeight pickerViewType:(PickerViewType)pickerViewType pickerViewData:(NSDictionary *)pickerViewDataDic cancelBlock:(CancelButtonBlock)cancelBlock surebuttonBlock:(SurebuttonBlock)sureButtonBlock{

    if (self == [super init]) {

        self.pickerViewType = pickerViewType;

        if (pickerViewType == PickerViewTyeDateComponent) {

            _dayArray = [NSMutableArray array];

            _monthArray = [NSMutableArray array];

            _yearArray = [NSMutableArray array];

            _dealArr = [NSMutableArray array];

            [self getDatePickDefaultValue];

        }

        ureButtonBlock(self.selectValueArr);

        [self.view addSubview:sureButton];

    }

    return self;

}

- (void)viewDidLoad {

    [super viewDidLoad];

}

(1)并不是执行了上面第一个方法才执行,viewDidLoad

但是,必须执行self = [super init];这个初始化方法才调用viewDidLoad

(2)不要在初始化方法里面写self.view

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值