当我们用present进行界面跳转时,会涉及到一个传向关系. 比如:A -> B    界面A跳转界面B A.presentedViewControlle = B B.presentingViewController = A 这就是两者间的关系. 所以有以下使用场景: 当界面B又跳转了界面C,在C关闭的时候,我们也想关闭B,可以这样: let B = self.presentingViewController self.dismiss(animated: true) { B?.dismiss(a…
在日常的开发中,多控制器之间的跳转除了使用push的方式,还可以使用 present的方式,present控制器时,就避免不了使用 presentedViewController.presentingViewController ,这两个概念容易混淆,简单介绍一下. 1:present 控制器的使用 使用present的方式,从一个控制器跳转到另一个控制器的方法如下: [self presentViewController:vc animated:YES completion:^{ }]; 2:…
ios标准开发者账号 ios企业开发者账号的区别总结   ios标准开发者项目 1.ios标准开发者项目账号可以发布到app store 2.ios标准开发者项目分为两种:①个人开发者②公司/机构开发者      其中②公司/机构开发者项目账号可以添加多达100台设备账号. 3.标准开发者账号可以同时作为mac app store的开发者账号,只需交钱即可.     ios企业开发者项目账号 1.加入企业开发者项目的账号只能是拥有DUNS编号的企业才能申请 2.企业开发者项目只能发布供内部使用的…
iOS exit(),abort(),assert()函数区别 exit() 退出程序 abort() 停止程序, assert()检查里面的参数如果为nil抛出异常:…
很多刚开始学习iOS开发的同学可能在看别人的代码的时候会发现有部分#import操作写在m文件中,而h文件仅仅使用@class进行声明,不禁纳闷起来,为什么不直接把#import放到h文件中呢?这是因为h文件在修改后,所有import该h文件的所有文件必须重 新build,因此,如果把#import写在h文件中,import该h文件的文件也就会产生不必要的编译,增加编译时间,特别是在项目文件多的情况 下.想象一下,如果只是修改一个h文件而导致上百个文件不必要的编译,那是一件多么让人纠结的事情..…
#import "TestViewController.h" #import "OneViewController.h" 在TextViewController写入点击事件: - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self click]; } - (void)click { OneViewController * vc = [OneVi…
android上的view的类叫View, 以下是它的class overview, This class represents the basic building block for user interface components. A View occupies a rectangular area on the screen and is responsible for drawing and event handling. View is the base class for wi…
概述 对于系统的非容器类对象,对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝).如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的. 对于系统的容器类对象,以上规则同样适用,但是容器内的元素全部都是浅拷贝,也就是说所有的元素拷贝的仅仅是指针,内存没被复制. copy与retain的区别 copy是创建一个新对象,retain是创建一个指针,引用对象计数加1.Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用…
一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存. 三.iOS里静态库形式? .a和.framework 四.iOS里动态库形式? .dylib和.framework 五.framework为什么既是静态库又是动态库? 系统的.framework是动态库,我们自己建立的.fram…
  block和代理是iOS开发中实现回调的两种方式,大多数情况下是用哪个都可以,主要看个人喜好.本文主要是对两者做一下对比. 1.block简介   在 iOS中, block一共分三种.   (1)全局静态 block,不会访问任何外部变量,执行完就销毁. ^{ NSLog(@"Hello World!"); }();   (2)保存在栈中的 block,当函数返回时会被销毁,和第一种的区别就是调用了外部变量. [UIView animateWithDuration:3 anima…
iOS开发中,会面对一个问题,Version和Build的区别.这两种均是版本号,但是在开发中还是有一定的区别,而且用处很大. Version 是版本号,在info.plist中对应的key是 CFBundleShortVersionString,这是在AppStore上看到的版本号.就是对外展示的版本号 Build 是内部使用的版本号,是开发过程中标识项目版本. 在iOS开发中,向Apple Developer提交的版本在检查的过程中,若是ipa包出了问题,就需要重新上传包.但是若不改动版本号…
可能有些还不清楚load和initialize的区别,下面简单说一下: 首先说一下 + initialize 方法:苹果官方对这个方法有这样的一段描述:这个方法会在 第一次初始化这个类之前 被调用,我们用它来初始化静态变量. initialize方法的调用时机,当向该类发送第一个消息(一般是类消息首先调用,常见的是alloc)的时候,先调用类中的,再调用类别中的(类别中如果有重写):如果该类只是引用,没有调用,则不会执行initialize方法.两者方法的共同点:自动调用父类的,不需要super…
区别很多,慢慢发现整理,注重细节,避免遗漏 消息推送区别: 1.推送渠道: 1.1 iOS走iOS自带的渠道进行系统内推送,应用内和应用外推送无明显差别,均可以收到push信息. 1.2 安卓由于谷歌推送服务在国内被墙,无法统一推送渠道,所以一般比较常用第三方推送服务 1.2.1安卓应用外(杀掉后台进程)的消息一般都无法直接推送,需要客户端集成系统内提供的第三方服务的SDK(如:华为移动服务SDK),由于应用外推送需要对不同厂家,不同ROM进行兼容适配,以及不同SDK版本,故测试时需要考虑测试范…
转自:http://blog.csdn.net/lvxiangan/article/details/43115131 一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存. 三.iOS里静态库形式? .a和.framework 四.iOS里动态库形式? .dylib和.framewo…
Mac OS X 10.6及iOS4.0之后导入了可以使全体线程更高效运行,并且使并行处理应用更易开发的架构,GCD(Grand Central  Dispatch),同时引入的还有Run Loop,线程(包括Cocoa和POSIX)和Operation.GCD拥有非常轻量级的工作单元和并发方式,并且由系统决定其最佳调度方式.这个时候出现了一个问题,NSOperation如何处理呢? 其实我们在通过NSOperation和GCD进行开发过程中,会发现两者执行的方式有许多相似之处,NSOperat…
.retain 与copy区别 retain 的仅仅是引用计数加1,但是并没有创建新的对象.它们的指针是指向相同的内存地址. copy 是创建一个新的对象作为原来对象的副本,新创建出来的引用计数并没有加1. copy 有两中协议 第一种NSCopying 与NSMutableCopying 一种是可变复制,一种是不可变复制 : 可变是通过 mutableCopy 来实现可变的复制 : 不可变是通过 copy 直接复制得到: 常用复制的的有:NSArray,NSNumber(只有不可变的复制),N…
很想写点关于多进程和多线程的东西,我确实很爱他们.但是每每想动手写点关于他们的东西,却总是求全心理作祟,始终动不了手. 今天终于下了决心,写点东西,以后可以再修修补补也无妨. 一.为何需要多进程(或者多线程),为何需要并发? 这个问题或许本身都不是个问题.但是对于没有接触过多进程编程的朋友来说,他们确实无法感受到并发的魅力以及必要性. 我想,只要你不是整天都写那种int main()到底的代码的人,那么或多或少你会遇到代码响应不够用的情况,也应该有尝过并发编程的甜头.就像一个快餐点的服务员,既要…
二者的区别在于: 1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你. 2.在头文件中, 一般只需要知道被引用的类的名称就可以了. 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称. 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件. 3.在编译效率方面考虑,如果你有10…
self和super的区别 #import <Foundation/Foundation.h> 首先先写两个类 fist和two,two继承fist类 @interface First:NSObject { int a;//声明了一个变量 } -(void) setA:(int)c;//对a赋值的方法 @end @implementation First -(void)setA:(int)c { a=c; } @end //类2 @interface Two : First { int b;…
******************tableview style****************************************************** // tableview style不同的区别 1.style=UITableViewStyleGrouped  默认会有headview和footview,头尾会空出一些距离,headview和footview会随tableview一起滑动, _saleTableView = [[UITableView alloc] i…
strong和weak的区别 strong表示保留它指向的堆上的内存区域不再指向这块区域了. 也就是说我强力指向了一个区域,我们不再指向它的条件只有我们指向nil或者我自己也不在内存上,没有人strong指向我了,weak表示如果还没有人指向它了,它就会被清除内存,同时被指向nil,因为我不能读取不存在的东西. weak只在IOS5.0使用 这并不是垃圾回收,我们用reference count表示堆上还有多少strong指针,当它变为0就马上释放.   本地变量都是strong,编辑器帮你计算…
线程和进程的区别主要在于它们是不同的操作系统资源管理方式.进程有独立的地址空间,一个进程崩溃后,在保护模式的影响下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径.线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等同于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些.但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程. 线程是CPU独立运行和独立调度的基本单位(可以理解为一个进程中执行的代码…
2017年1月31日 转换后变成 2018年1月31日,相差一年.这是为什么呢? 原因:YYYY 是以周为单位计算的,我们平常计算日期时最好用yyyy,yyyy才是标注的年份 如果一月1日是星期一,星期二,星期三,星期四,它是在01周.如果一月1日是星期五,星期六或星期日,它在前一年的52周或53周 例子:使用yyyy时间 NSDate *currentDateTime = [NSDatedate]; NSDateFormatter *fomatter = [[NSDateFormatteral…
堆和栈的区别主要有以下五点: 1.管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来讲,释放工作由程序员控制,容易产生memory leak(内存泄露). 2.申请大小: 栈是向低地址扩展的数据结构,是一块连续的内存区域.这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,是一个编译时就确定的常数,如果申请空间超过栈的剩余空间时,将提示overflow(溢出).因此,能从栈获得的空间较小. 堆是向高地址扩展的数据结构,是不连续的内存区域.这是由于系统是由链表来存储的空闲内…
block是封装了一段代码的OC对象,可以被设为Property, 在调用block的地方block都会被替换成相应的代码,相当于内联函数. 函数可以使代码更加整洁易读,使用block会使代码可读性变差,另外函数可以做单元测试,block无法做单元测试.…
OC object-c 为了让java的开发者习惯 使用.的操作,所以可以将接口类中的变量 使用@property来声明属性.但是在.h中声明的属性,必须在.m中使用@synthesize或者@dynamic来实现(传言,在最近出的ios6中这不已经省了),否则属性不可用. 熟悉object-c语法的都知道@synthesize实际的意义就是 自动生成属性的setter和getter方法. @dynamic 就是要告诉编译器,代码中用@dynamic修饰的属性,其getter和setter方法会…
类别 .h @interface NSString(XXXXXX) -(NSInteger)getLen; @end .m @implementation NSString(XXXXXX) -(NSInteger)getLen { return 0; } @end //////////////////////////////////////////////////////////////////////////////////////////////////// 扩展 .h @interface…
用最简单的语言来解释就是:setFrame和setBounds都是为了把子view加载到父view上去,但设置的参数坐标系不同,setFrame是该view在父view坐标系统中的位置和大小,setBounds是该view在本地坐标系统中的位置和大小. 下面是盗来的资料: 再来看张图就明白了, frame: 该view在父view坐标系统中的位置和大小.(参照点是,父亲的坐标系统)         bounds:该view在本地坐标系统中的位置和大小.(参照点是,本地坐标系统,就相当于ViewB…
atomic :  变量默认是有该有属性的,这个属性是为了保证在多线程的情况下,编译器会自动生成一些互斥加锁的代码,避免该变量的读写不同步的问题. nonatomic  : 如果该对象无需考虑多线程的情况,这个属性会让编译器少生成一些互斥代码,可以提高效率. atomic 的意思是setter/getter 这个函数,是一个原语操作,如果有多个线程同时调用setter的话,不会出现某一个线程执行完setter全部语句之前,另一个线程开始执行setter情况,相当于函数头尾加了锁一样,可以保证数据…
imageNamed 方法 1)后面的参数是icon的名字,图片可以存在项目中,也可以存在Asset中 2)该方法只适合一些中小型的图片读取,而一些比较大的资源图片并不适合用这个方法 3)这个方法加载完图片后会存在Cache里面,当用这个方法加载的时候,会在系统缓存中查找并返回一个对象,如果缓存中没有找到对应的对象,会从指定的文档中加载返回对象 4)优缺点:加载效率高,但消耗内存,当内存过大时,会出现内存警告,或者内存泄露 imageWithContentsOfFile 方法 1)后面的参数是图…