1.NSRULSession
看了英文才知道NSRULSessionDataTask NSURLSessionDownloadTask NSURLSessionUploadtask
感觉NSURLSession 算是这是task的工厂 使用工厂方法分别创建这几个不同的task子类
这个就是你之前说的让一些请求使用缓存 一些请求不使用缓存
2.NSString的讨论
两次打印结果为毛s3都是789,找了半天是给_s3赋值的时候没有调用self.s3,这样没有触发set方法,setString方法看似像是set方法,其实不是的。
s3他只是引用了ts3这个指针的地址,ts3指针里面存储的变了,看到本质 *p 就是个指针,在64位系统里 占8个字节,在stack里,只要记住这些东西 绝对乱不了。面试我的人 就从来没看到我的 技术能力,我比表面更强大。nb,超神的话总能让我震精。
3.extendedLayoutIncludesOpaqueBars相关
最后一个属性extendedLayoutIncludesOpaqueBars = Yes只有在上面两个成立的情况下才有用
上面是设置translucent = yes的时候
自己看图意会吧,反正我是没听懂他说了些啥。
4.topLayoutGuide和safeAreaInsets
第一张是vc.view,它在没有NavBar的情况下原点就是(0,0),没有属性可以改变他。第二张图是在vc.view中又加了个subview,然后通过约束设置 topconstraint = vc.topLayoutGuid才出现这样的效果的,但是vc.view 原点还是 (0,0),只不过是我给改成了whiteColor 背景色而已,在apple里有案例:https://developer.apple.com/library/content/qa/qa1797/_index.html,topLayoutGuid这个属性在iOS11被遗弃了,改成safeAreaInsets。
咱自己 通过纯frame操作的话 需要在viewDidLayoutSubViews 这个方法里拿到 vc.topLayoutGuide 这个属性
它是个遵守了UILayoutSupport协议的对象
这里面有个length,咱们设置subview frame的时候 可以这么设
subView.frame = CGRectMake(0, self.topLayoutGuide. length, self,view,frame.size.width, self.view.frame.size.height - self.topLayoutGude. length);
但是iOS11这个layoutGuide属性不能用了,iOS11以后用vc.view.safeAreaInsets这个。没回应了??
frame算的话 就是用vc.view.safeAreaInsets
这个vc.xib 没有使用safeAreaInsets,但是在代码里可以获取到safeAreaInsets的值
大概这么个意思,好像在适配X的时候可以用到。
5._和self
原来我还以为block里面写数值类型的变量怎么写都没关系,现在看看是这么个意思吗?
6.新奇写法
这种写法 注意一下 否则都不知道怎么来的
7.safeArea
虽然把xcode最低支持版本改成iOS9在xib里safeArea就不会报错了,但其实safeArea并没有产生作用,如上图。
吧safeArea关闭后,两边就一样了。
8.url、uri、urn
9.看一个小例子吧
NSCalendar *cal = [NSCalendar currentCalendar];
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
cal.locale = locale;
NSDate *oldDate = [NSDate date];
NSDateComponents *components = [cal components:NSCalendarUnitMonth|NSCalendarUnitYear|NSCalendarUnitDay fromDate:[NSDate date]];
NSDate *newDate = [cal dateFromComponents:components];
NSLog(@"old - %@,new - %@",oldDate,newDate);
猜猜这两个date有啥区别?
old - 2018-02-24 07:07:30 +0000,new - 2018-02-24 00:00:00 +0000
10.CollectionviewCell autolayout不起作用
直接放链接吧https://stackoverflow.com/questions/25804588/auto-layout-in-uicollectionviewcell-not-working,这条是selfStrong提供的
11.看看这个对比
12.说倒序遍历数组可以在遍历的时候删除元素?
因为每次 i和 count - 1 是一样的 所以相当于每次删掉数组的最后一个
13.对象等同性
至于我问他为啥hash是这两个加起来,是不是哪两个对象比较就返回这两个对象hash的和,他跟我说是也无需要。我问他原理,他跟我说业务需要,nb。
14.meta class
15.Block异步通知和Delegate异步通知的比较
通过上面介绍我们可以看到苹果的核心定位库分别采用了2种方法来实现异步通知。那么这两种有什么优劣以及差异呢?我们又应该在哪种情况下选用哪种方式呢?这里可以归纳几点供大家参考:
如果某个类中具有多个方法,而每个方法又实现了不同的功能,并且方法的异步返回的数据和这个方法具有很强的关联性那么就应该考虑使用block而不用Delegate。
如果类中的方法的异步方法是那种一次交互就得到一个不同的结果,而且得到的结果和上一次结果没有什么关联。通俗的讲就是一锤子买卖的话,那么就应该考虑使用block而不用Delegate。
如果我们调用类中的某个方法,而调用前我们设置了一些上下文,而调用方法后我们又希望根据这个上下文来处理异步返回的结果时,那么就应该考虑使用block而不是Delegate。
如果我们调用类里面的某个方法,而返回的结果不需要和上下文进行关联那么就考虑使用Delegate而不用block。
如果要实时的观察业务类里面的某个属性的变化时,我们就应该考虑使用Delegate而不是使用block。
如果业务类里面的异步通知可能分为好几个步骤那么就考虑使用Delegate而不是使用block。
16.一个宏
//在某个公共的地方定义如下宏
#define BINDVIEW(viewclass) \
-(void)loadView \
{\
self.view = [[viewclass alloc] initWithFrame:[UIScreen mainScreen].bounds];\
}\
-(id)forwardingTargetForSelector:(SEL)aSelector\
{\
struct objc_method_description omd = protocol_getMethodDescription(@protocol(viewclass), aSelector, NO, YES);\
if (omd.name != NULL)\
{\
return self.view;\
}\
return [super forwardingTargetForSelector:aSelector];\
}\
...........................
//XXXXViewController.m
#import "XXXXViewControllerView.h"
//视图控制器也需要实现XXXXViewControllerView接口。这样视图控制器中就可以直接访问视图的一些属性了。
@interface XXXXViewController ()
@end
@implementation XXXXViewController
//这里直接用宏即可
BINDVIEW(XXXXViewControllerView)
//...这里添加其他代码。
@end
欧阳大哥
17.childVC
@interface UIViewController (UIContainerViewControllerProtectedMethods)
//得到一个父视图控制器里面的所有子视图控制器
@property(nonatomic,readonly) NSArray<__kindof UIViewController *> *childViewControllers;
//添加子视图控制器
- (void)addChildViewController:(UIViewController *)childController;
//将自己从父视图控制器中删除
- (void)removeFromParentViewController;
//如果我们要添加一个子视图控制器和删除一个子视图控制器同时执行并且要有动画效果时可以采用这个方法
- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^ __nullable)(void))animations completion:(void (^ __nullable)(BOOL finished))completion;
//如果容器控制器想控制子视图控制器的呈现调用回调那么要重载容器控制器的shouldAutomaticallyForwardAppearanceMethods方法并返回NO。
//然后在适当的时候调用子视图控制器的下面这两个方法来实现呈现的自定义控制处理。
//这两个方法是对子视图控制器进行的调用,并且要成对执行。
- (void)beginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animated;
- (void)endAppearanceTransition;
// Override to return a child view controller or nil. If non-nil, that view controller's status bar appearance attributes will be used. If nil, self is used. Whenever the return values from these methods change, -setNeedsUpdatedStatusBarAttributes should be called.
@property(nonatomic, readonly, nullable) UIViewController *childViewControllerForStatusBarStyle;
@property(nonatomic, readonly, nullable) UIViewController *childViewControllerForStatusBarHidden;
// Call to modify the trait collection for child view controllers.
- (void)setOverrideTraitCollection:(nullable UITraitCollection *)collection forChildViewController:(UIViewController *)childViewController;
- (nullable UITraitCollection *)overrideTraitCollectionForChildViewController:(UIViewController *)childViewController;
// Override to return a child view controller or nil. If non-nil, that view controller's preferred user interface style will be used. If nil, self is used. Whenever the preferredUserInterfaceStyle for a view controller has changed setNeedsUserInterfaceAppearanceUpdate should be called.
@property (nonatomic, readonly, nullable) UIViewController *childViewControllerForUserInterfaceStyle;
@end
@interface UIViewController (UIContainerViewControllerCallbacks)
//容器控制器可以重载这个方法来控制子视图控制器中的视图在添加到窗口以及从窗口删除时子视图控制器是否会自动调用viewWillAppear/viewDidAppear/viewWillDisappear/viewDidDisappear这几个方法,默认是YES。
//如果容器控制器重载这个方法返回NO时那么容器控制器就可以手动的让子视图控制器执行对应的呈现回调方法。
@property(nonatomic, readonly) BOOL shouldAutomaticallyForwardAppearanceMethods
//子视图控制器将要移动到父视图控制器和已经移动到父视图控制器中时调用,子视图控制器可以重载这两个方法
- (void)willMoveToParentViewController:(nullable UIViewController *)parent;
- (void)didMoveToParentViewController:(nullable UIViewController *)parent;
@end
欧阳大哥