xml地图|网站地图|网站标签 [设为首页] [加入收藏]

常见问题的整理

来源:http://www.ccidsi.com 作者:集成介绍 人气:124 发布时间:2020-04-05
摘要:对此通报,我们恐怕都不面生,它是一个单例,允许当事件发生时通报一些对象,让大家在低端次耦合的气象下,来完毕通讯的目标。 照会的优势:1.不需求编写制定太多代码,实现比

对此通报,我们恐怕都不面生,它是一个单例,允许当事件发生时通报一些对象,让大家在低端次耦合的气象下,来完毕通讯的目标。

照会的优势:1.不需求编写制定太多代码,实现比较轻易2.对此一个生出的照管,可以多少个目的作出反应,就是说通告是一对多的花样

照会的老毛病:1.在编写翻译期不会检讨通报是或不是能够被观看者正确管理2.在假释注册的指标时,须要在通报大旨打消注册3.在调度应用时,难以追踪程序4.发出通知后,不可能从观望者这里获得别的反馈音讯

文告的为主完毕:

- viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector name:@"test" object:nil]; NSLog(@"注册通知 - %@",[NSThread currentThread]);}- touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:nil]; NSLog(@"发送通知完成 - %@",[NSThread currentThread]);}- test { NSLog(@"接收到通知 - %@",[NSThread currentThread]); sleep;}

打字与印刷结果:

2017-06-13 16:53:01.040 通知的基本使用[24531:3283934] 注册通知 - <NSThread: 0x600000079c80>{number = 1, name = main}2017-06-13 16:53:10.334 通知的基本使用[24531:3283934] 接收到通知 - <NSThread: 0x600000079c80>{number = 1, name = main}2017-06-13 16:53:13.335 通知的基本使用[24531:3283934] 发送通知完成 - <NSThread: 0x600000079c80>{number = 1, name = main}

专一打字与印刷结果:在test方法推行达成之后,才会打字与印刷发送达成的log。

一旦在子线程发送通告:

- viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector name:@"test" object:nil]; NSLog(@"注册通知 - %@",[NSThread currentThread]);}- touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ NSNotification *notification = [NSNotification notificationWithName:@"test" object:nil]; // NSPostASAP是接收不到通知的 要使用NSPostNow [[NSNotificationQueue defaultQueue] enqueueNotification:notification postingStyle:NSPostNow]; NSLog(@"发送通知完成 - %@",[NSThread currentThread]); });}- test { NSLog(@"接收到通知 - %@",[NSThread currentThread]); sleep;}

打字与印刷结果:

2017-06-13 17:05:01.133 通知的基本使用[25191:3296062] 注册通知 - <NSThread: 0x608000076440>{number = 1, name = main}2017-06-13 17:05:02.423 通知的基本使用[25191:3296125] 接收到通知 - <NSThread: 0x608000267980>{number = 3, name = }2017-06-13 17:05:05.523 通知的基本使用[25191:3296125] 发送通知完成 - <NSThread: 0x608000267980>{number = 3, name = }

得出结论:接纳布告的线程和出殡和安葬通知的线程是一致的,即使在事实上支出进度中,大家是在子线程中发送公告的,在收受到通报之后,需求刷新UI等操作,应当要回到主线程。

- viewDidLoad { [super viewDidLoad]; _observe = [[NSNotificationCenter defaultCenter] addObserverForName:@"test" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) { NSLog(@"接收到通知 - %@",[NSThread currentThread]); sleep; }];}- touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:nil]; NSLog(@"发送通知完成 - %@",[NSThread currentThread]); });}

打字与印刷结果:

2017-06-13 18:21:38.367 通知的基本使用[29365:3382047] 接收到通知 - <NSThread: 0x600000063d80>{number = 1, name = main}2017-06-13 18:21:41.368 通知的基本使用[29365:3382100] 发送通知完成 - <NSThread: 0x600000071bc0>{number = 3, name = }

得出结论:使用NSOperationQueue能够让接收文告的线程和出殡和下葬文告的线程不等同,让选用布告的线程在主线程,就足以刷新UI等操作了。

- touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { WWPerson *person = [[WWPerson alloc] init]; [person test];}

当向person发送test本条音信时,runtime库会依据指标的isa指南针找到该目的实际所属的类,然后在这里类的措施列表甚至父类的艺术列表里面找相应的艺术运维,假使在最顶层的父类中依然找不到对应的情势达成时,程序在运作时就能够报unrecognized selector sent to的荒诞何况崩溃,不过早前,objc的运作时提交了幸免程序崩溃的贰次机遇。

  1. Method resolutionobjc运转时会调用 resolveInstanceMethod:或者 resolveClassMethod:,让大家有机会提供二个函数达成而不形成程序崩溃,如若在这里中间增添了函数,系统就能够重新启航一回音信发送的过程,不然就能够移到下一步的新闻转载。
  resolveInstanceMethod:sel { if (sel == NSSelectorFromString { /** class: 给哪个类添加方法 SEL: 添加哪个方法 IMP: 方法实现 => 函数 => 函数入口 => 函数名 type: 方法类型:void用v来表示,id参数用@来表示,SEL用:来表示 */ class_addMethod(self, sel, test, "v@:@"); return YES; }else { return [super resolveClassMethod:sel]; }}void test(id self, SEL _cmd, NSNumber *meter) { NSLog(@"测试 - WWPerson");}

2.Fastforwarding要是对象对象达成了-forwardingTargetForSelector:的方法,runtime就能够调用那么些方法,给我们三个火候把这几个新闻转载给别的的对象,只要那个办法重临值不是nilself,整个消息发送的长河就能被重启,当时发送的靶子会化为大家重临的这几个指标,不然就能够移到下一步。

- forwardingTargetForSelector:aSelector { WWTarget *target = [[WWTarget alloc] init]; if ([target respondsToSelector:aSelector]) { return target; // 就会去调用WWTarget里面的test方法 }else { return [super forwardingTargetForSelector: aSelector]; }}

3.Normal Fowarding若是上边几种方法都未曾被完成的话,就能够到来第三步,那是runtime给大家最后一回防止崩溃的空子,首先它会-methodSignatureForSelector:来得到函数的参数和重临值类型,借使再次来到值为nil,则runtime会发出-doesNotRecognizeSelector: 的音讯,程序崩溃。假使回去了七个函数具名,runtime会成立四个NSInvocation对象并发送-forwardInvocation:的音信给指标对象。

- (NSMethodSignature *)methodSignatureForSelector:aSelector { NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:"v@:"]; return signature;}- forwardInvocation:(NSInvocation *)anInvocation { SEL selector = [anInvocation selector];// anInvocation里面保存的是selector/target/参数 WWTarget *target = [[WWTarget alloc] init]; if ([target respondsToSelector:selector]) { [anInvocation invokeWithTarget:target]; } }

假若上边的三步都不曾完结的话,就能够调用-doesNotRecognizeSelector:,程序崩溃。

深拷贝:内容拷贝,拷贝出来的指标和事前的目标的地址不等同。浅拷贝:指针拷贝,拷贝出来的靶子和事情未发生前的对象之处同样。直接上粗略示例相比好:

1.对可变对象实行 copy操作

- viewDidLoad { [super viewDidLoad]; NSMutableString *mStr = [NSMutableString stringWithString:@"mStr"]; NSString *copyStr = [mStr copy]; [mStr appendString:@"123"]; // mStr:0x60800007f440 - copyStr:0xa0000007274536d4 NSLog(@"mStr:%p - copyStr:%p",mStr, copyStr);} 结论:1.对可变对象 进行 copy 操作是内容拷贝 2. copy 出来的copyStr是NSString类型的,如果对copyStr调用NSMutableString的方法appendString是会崩溃的。

2.对可变对象进行mutableCopy操作

- viewDidLoad { [super viewDidLoad]; NSMutableString *mStr = [NSMutableString stringWithString:@"mStr"]; NSMutableString *mutableCopyStr = [mStr mutableCopy]; // str:0x608000260140 - mutableCopyStr:0x608000260440 NSLog(@"str:%p - mutableCopyStr:%p",mStr, mutableCopyStr); } 结论:1.对可变对象 进行 mutableCopy 操作是内容拷贝 2. mutableCopy 出来的mutableCopyStr是 NSMutableString 类型

3.对不可变对象进行copy操作

- viewDidLoad { [super viewDidLoad]; NSString *Str = [NSString stringWithFormat:@"Str"]; NSString *copyStr = [Str copy]; // str:0x10147e128 - copyStr:0x10147e128 NSLog(@"str:%p - copyStr:%p",Str, copyStr);}结论:对不可变对象 进行 copy 操作是指针拷贝

4.对不可变对象实行mutableCopy操作

- viewDidLoad { [super viewDidLoad]; NSString *mStr = [NSString stringWithFormat:@"mStr"]; NSMutableString *mutableCopyStr = [mStr mutableCopy]; // str:0xa0000007274536d4 - mutableCopyStr:0x60800026a680 NSLog(@"str:%p - mutableCopyStr:%p",mStr, mutableCopyStr);} 结论:1.对不可变对象 进行 mutableCopy操作 是内容拷贝 2.对mStr进行mutableCopy操作的mutableCopyStr是NSMutableString类型的

总的来讲以上所述:唯有对 不可变对象进行copy操作是指针拷贝,别的的都以内容拷贝

设置returnKeyType质量就可以,

 UIReturnKeyDefault, UIReturnKeyGo,// 前往 UIReturnKeyGoogle,// google UIReturnKeyJoin,// 加入 UIReturnKeyNext,// 下一步 UIReturnKeyRoute,// 路线 UIReturnKeySearch,// 搜索 UIReturnKeySend, // 发送 UIReturnKeyYahoo,// 搜索 UIReturnKeyDone,// 完成 UIReturnKeyEmergencyCall,// 紧急电话 UIReturnKeyContinue NS_ENUM_AVAILABLE_IOS,// 继续

viewDidLayoutSubviewslayoutSubviews前方调用layoutSubviewsdrawRect :日前调用

2017-06-14 10:31:35.215 layoutSubviews等的调用顺序[7357:98975] -[ViewController viewDidLoad]2017-06-14 10:31:35.215 layoutSubviews等的调用顺序[7357:98975] -[WWView initWithFrame:]2017-06-14 10:31:35.220 layoutSubviews等的调用顺序[7357:98975] -[ViewController viewWillLayoutSubviews]2017-06-14 10:31:35.220 layoutSubviews等的调用顺序[7357:98975] -[ViewController viewDidLayoutSubviews]2017-06-14 10:31:35.220 layoutSubviews等的调用顺序[7357:98975] -[WWView layoutSubviews]2017-06-14 10:31:35.221 layoutSubviews等的调用顺序[7357:98975] -[WWView drawRect:]

#import "WWView Tools.h"#import <objc/runtime.h>static char strKey;@implementation WWView - setDynamicStr:(NSString *)dynamicStr { /** id object: 需要给哪个对象的属性赋值 const void *key:属性对应的key值 id value:设置属性的值为value objc_AssociationPolicy policy:关联策略 枚举值 一般选择NONATOMIC */ objc_setAssociatedObject(self, &strKey, dynamicStr, OBJC_ASSOCIATION_COPY_NONATOMIC);}- (NSString *)dynamicStr { return objc_getAssociatedObject(self, &strKey);}

因为关乎到探访相册,所以先在plist文件里面增加NSPhotoLibraryUsageDescription同意应用程序访谈你的相册

- touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // self.testView:要生成为图片的view UIGraphicsBeginImageContextWithOptions(self.testView.bounds.size, 0, [[UIScreen mainScreen] scale]); [self.testView.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageWriteToSavedPhotosAlbum(viewImage, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), nil); });}- imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:contextInfo{ if  { NSLog; }else { NSLog(@"失败 - %@",error); }}

// html_content:含有html标签的富文本1.用UILabel去加载NSMutableAttributedString *attributeStr = [[NSMutableAttributedString alloc] initWithData:[html_content dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType }documentAttributes:nil error:nil];self.contentLabel.attributedText = attributeStr;PS:如果要改变文本的字体大小颜色等,一定要在这后面改2.直接使用UIWebView去加载 //设置字体大小为15,颜色rgb(124,181,236),边距为15,并且图片的宽度自动充满屏幕,高度自适应 NSString *html_content = @"要加载的html内容"; NSString *htmls = [NSString stringWithFormat:@"<html> n" "<head> n" "<style type="text/css"> n" "body {margin:15;font-size:15;color:%@}n" "</style> n" "</head> n" "<body>" "<script type='text/javascript'>" "window.onload = function(){n" "var $img = document.getElementsByTagName;n" "for(var p in $img){n" " $img[p].style.width = '100%%';n" "$img[p].style.height ='auto'n" "}n" "}" "</script>%@" "</body>" "</html>",@"rgb(124,181,236)", html_content]; [self.contentWebView loadHTMLString:htmls baseURL:nil];

能够设想动用Xcode - Open Developer Tool - Application Loader来消除

The filename 未命名.ipa in the package contains an invalid character. The valid characters are:A-Z,a-z,0-9,dash,period,underscore,but the name cannot start with a dash,period,or underscore.

消除办法:在Archive之后的包不可能再试中文名,把XXX.ipa改成Lithuania语名就解决了。

本文由68399皇家赌场发布于集成介绍,转载请注明出处:常见问题的整理

关键词: 68399皇家赌场 iOS 常见问题

上一篇:分享一些iOS实用Demo

下一篇:没有了

频道精选

最火资讯