
iOS之OC
文章平均质量分 78
程序员的修养
好好学习
展开
-
KVO全家桶
1.Notification (1)A对B感兴趣,A就是观察者,B为主题也就是变化源 对于感兴趣的A来说,首先要订阅通知,即将自己添加为观察者(A是观察者,怎么观察的以及观察到了会做些什么) [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notice:) name:@"tongzhi" obje原创 2017-02-20 16:41:00 · 416 阅读 · 0 评论 -
Block看这一篇就够了
一、iOS内存分布在iOS的程序类似C/C++的程序的内存分布,包括以下五大区栈区:是用户存放程序临时创建的局部变量一般指针存在栈区,自动分配内存,局部变量作用域结束,系统立即回收;除此以外, 在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值 也会被存放回栈中堆区:堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减一般对象放在堆上,即alloc出来的对象在iOS的ARC程序中,系统自动管理计数器,计数器为0的时候,在当原创 2021-06-07 09:05:36 · 295 阅读 · 0 评论 -
关联对象的实现
关联对象的实现介绍我们在开发中都使用过category,并且都了解category不能添加属性,因为在runtime时候,类的成员变量已经固定,并且categery的底层实现中没有设置存放成员变量的逻辑,所以无法给category添加属性,如果要添加属性需要使用关联对象来处理添加objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)获取objc_getAs原创 2021-04-12 10:55:50 · 352 阅读 · 0 评论 -
load方法研究
load函数应该知道的事情一、load介绍类和分类的load方法是类或者分类被加载到runtime时被调用,并且只调用一次。类和分类的load方法都会调用。而“类或者分类被加载到runtime时”时动态链接阶段,此时main函数还未执行。load 方法的运行时间过早,所以这里可能不是一个理想的环境,因为某些类可能需要在在其它类之前加载,但是这是我们无法保证的。但是,framework以及动态库是先加载的,所有库加载完成之后,才会执行运行时的load方法,所以在load方法中调用 framework原创 2021-03-31 11:35:30 · 817 阅读 · 0 评论 -
iOS 集合的深复制与浅复制
iOS 集合的深复制与浅复制概念对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;深复制是直接拷贝整个对象内存到另一块内存中。一图以蔽之 再简单些说:浅复制就是指针拷贝;深复制就是内容拷贝。集合的浅复制 (shallow copy)集合的浅复制有非常多种方法。当你进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的原创 2017-02-20 15:48:01 · 267 阅读 · 0 评论 -
iOS获取系统时间的各种方式
受系统时间影响的方式受系统时间影响,表示用户修改设备时间这些获取时间方式返回的值会发生变化1、NSDate该函数返回的时间以UTC为基准,它描述的是时间线上的某个绝对值,例如[NSDate date]表示当前时间距离UTC 2001年一月一日00:00:00过了多长时间。NSDate和市区和文化无关,如果要展示具体格式的时间,需要NSDateFormatter和NSTimeZone的辅助2、CFAbsoluteTimeGetCurrent()该函数返回的时间以GMT为标准的,2001年一月一日00原创 2021-01-26 15:30:55 · 5422 阅读 · 0 评论 -
解析HTML标签
最近做的需求需要使用富文本,因此探究了一番,我们怎么样解析服务器的html标签的相信很多人都说使用NSMutableAttributedString就可以解析,下面代码解析html标签并且显示在label上。 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 300, 200)]; NSAttributedString *attributedString = [[NSAttributedString alloc] i原创 2021-01-18 11:17:41 · 1039 阅读 · 0 评论 -
在协议、分类、继承中使用属性的研究
协议中使用属性在协议中是可以定义属性,下面我们定义了一个PersonProtocol协议,在里面定义work属性,但是只有对应的getter和setter方法,没有实例变量,我们看一下实例@protocol PersonProtocol <NSObject>@property (nonatomic, copy) NSString *work;@end@interface Person : NSObject<PersonProtocol>@property(nona原创 2020-10-15 11:45:14 · 198 阅读 · 0 评论 -
互斥锁--NSCondition
NSCondition**介绍:**条件锁,是对条件变量和互斥量的封装,互斥量用于保护条件变量的修改,而条件变量实现线程之间的同步。条件既充当当前线程中的锁又充当检查条件,条件锁在执行条件触发的任务时保护临界资源不被其他线程修改,检查条件要求条件在线程继续执行其任务之前为真,条件不成立时,阻塞线程。直到另一个线程向条件对象发出信号为止它都一直保持阻塞状态。@interface NSCondition : NSObject <NSLocking> {@private void *_p原创 2020-09-28 17:47:54 · 549 阅读 · 0 评论 -
互斥锁--pthread_mutex
互斥锁pthread_mutexpthread_mutex是C语言中在多线程编程中使用的互斥锁,OC中的NSLock等封装的面向对象的锁是对pthread_mutex的封装,常用的API如下1、初始化锁pthread_mutex_init(pthread_mutex_t mutex,const pthread_mutexattr_t attr);初始化一个锁,初始化成功返回零,参数介绍如下(1)pthread_mutex_t为锁的类型,用于指定互斥锁的属性,有四种类型如下:PTHREAD_原创 2020-09-27 15:27:30 · 4177 阅读 · 1 评论 -
互斥锁--@synchronized
@synchronized介绍:@syncheinized也是互斥锁,相比其他锁使用比较简单,只需将临界资源放在@synchronized里面即可,如下@synchronized (self) { [arr addObject:item];//防止不同线程向同时操作数组}官方文档中描述@synchronized的block添加了异常处理,有异常时将自动释放互斥量。实现细节:Xcode编译后@s ynchronized的block会变成objc_sync_enter和objc_sync_e原创 2020-09-27 15:12:09 · 332 阅读 · 0 评论 -
互斥锁--NSLock
互斥锁–NSLock互斥锁主要用于对临界区资源的保护,在多线程编程中防止不同的线程对同一公共资源操作(读或写),当A线程的任务没有执行完毕时(资源被锁住),B线程会进入睡眠状态等待A线程的任务执行完毕,当A程的任务执行完毕,B线程会自动唤醒然后执行任务。iOS中常用的互斥锁有NSLock、@synchronized、pthread_mutex、NSCondition、NSConditionLock、NSRecursiveLock。下面我们逐一介绍这几个锁,现在我们先看一下NSLock的相关内容。1、NS原创 2020-09-27 11:49:05 · 1424 阅读 · 0 评论 -
performSelector系列方法的研究
- (id)performSelector:(SEL)aSelector;在开发中,我们想立即执行某个方法时,可以调用NSObject的performSelector:方法实现,该方法是不传参方法,如果想传参,可以使用下面方法- (id)performSelector:(SEL)aSelector withObject:(id)object;- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)objec原创 2020-09-18 15:54:16 · 825 阅读 · 0 评论 -
association weak 属性
association weak 属性当给类添加分类添加属性时,我们一般使用关联对象来实现管理关联对象的方法:objc_setAssociatedObject(id object, void * key, id value, <objc_AssociationPolicy policy)以给定的key为对象设置关联对象的valueobjc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key)根据key从对象中获原创 2020-08-14 17:58:55 · 632 阅读 · 0 评论 -
block、delegate比较
block、delegate比较:block和delegate都能实现回调传值,完成对象之间的通信和交互。block优缺点代码变得连贯,使用也简单,一般不需要存储临时数据,能够直接访问上下文。block缺点:block不够安全,使用 block 时稍微不注意就形成循环引用,导致对象释放不了。这种循环引用,一旦出现就比较难检查出来。block效率低,block出栈需要将使用的数据从栈内存拷贝到堆内存在多个通信事件的时候,block显得不够直观也不易维护。delegate优缺点:原创 2020-08-14 17:53:23 · 537 阅读 · 0 评论 -
#ifdef、#else、#endif
#ifdef、#else、#endif1、第一种形式,当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。#ifdef 标识符 程序段1#else 程序段2#endif其中#else部分也可以没有,即:#ifdef 程序段1#denif2、第二种形式,若标识符未被定义则编译程序段1,否则编译程序段2,只是第一行与第一种形式不同:将“ifdef”改为“ifndef”。#ifndef 标识符 程序段1#else 程序段2#endif原创 2020-07-20 09:01:43 · 2156 阅读 · 0 评论 -
URLWithString返回nil问题
问题描述在使用URLWithString生成NSURL时,如果出现中文,会导致返回的NSURL为nil。代码如下:NSURL *aUrl = [NSURL URLWithString:@"http://中文域名"];stackoverflow相关讨论查询了URLWithString的官方文档,其中有一段话解决了我的疑惑。This method expects URLString to...原创 2019-12-17 11:33:08 · 1328 阅读 · 0 评论 -
文件基本操作
1、文件的创建//指向文件目录 NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; NSString *allPath = [path stringByAppendingPathComponent:@”heartTest.txt”];//需要写入原创 2016-10-01 15:50:03 · 348 阅读 · 0 评论 -
判断本应用是否可以定位
用到地图定位的时候,会判断系统是否允许本应用定位。而[CLLocationManager locationServicesEnabled]检测的是整个iOS系统的位置服务开关,无法检测当前应用是否被关闭 下面有两种方法解决 (1)通过+locationServicesEnabled和authorizationStatus对应的状态判断 if ([CLLocationManager locatio原创 2016-06-07 15:54:55 · 441 阅读 · 0 评论 -
iOS中成员变量、属性变量、局部变量、全局变量
@synthesize和@dynamic区别 在声明property属性后,有2种实现选择 @synthesize 编译器期间,让编译器自动生成getter/setter方法。 当有自定义的存或取方法时,自定义会屏蔽自动生成该方法 @dynamic 告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告 然后由自己实现存取方法 或存取方法在运行时动态创建绑定原创 2016-03-26 10:11:20 · 585 阅读 · 0 评论 -
[[UIApplication sharedApplication] openURL:]
iOS开发中使用[[UIApplication sharedApplication] openURL:]加载其它应用 在iOS开发中,经常需要调用其它App,UIApplication:openURL:方法是实现这一目的的最简单方法,{iPhone不允许同时运行两个程序,但我们可以在自己的程序中启动另一个程序)该方法一般通过提供的url参数的模式来调用不同的App,实现应用程序间通信 通过o原创 2016-03-16 14:30:09 · 1902 阅读 · 0 评论 -
NSBundle介绍和使用
1.NSBundle介绍 bundle是一个目录,它包含了程序会使用的资源,例如图像、声音、变异好的代码以及nib文件。cocoa提供了类的NSBundle bundle中的有些资源可以本地化.例如,对于foo.nib,我们可以有两个版本: 一个针对英语用户,一个针对法语用户. 在bundle中就会有两个子目录:English.lproj和French.lproj,我们把原创 2016-03-02 09:07:11 · 686 阅读 · 0 评论 -
IOS Sqlite的使用方法
1.Sqlite的简介 Sqlite是嵌入式的关系型数据库,其特点如下: 1)它是基于c语言开发的数据库,libsqlite3框架是基于c语言开发的。 2)在ios中要使用c语言对数据库进行操作。 3)sqlite采用的是动态数据类型,值的数据类型与值本身相关,与它的容器无关 2.iOS中使用sqlite的步骤 1)打开数据库,利用sqlite3_open()打开数据库。 用sqlit原创 2016-02-27 09:21:40 · 841 阅读 · 0 评论 -
iOS中 static、const、extern、define
1、 static、const、extern、define (1)define—const—-苹果推荐使用const define也就是通常所说的宏,宏是在预编译时处理变量的替换,使用宏除了定义变量还定义一些函数。但是,宏不做编译检查,不报编译错误;大量使用宏将造成编译时间长。 const指字符串常量,它是在编译阶段处理变量的替换,只能定义变量。Const做编译检查。NSString * c原创 2018-01-09 11:42:03 · 579 阅读 · 0 评论 -
nonatomic\ strong\weak\assgn
http://blog.youkuaiyun.com/mars2639/article/details/7352540 atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。 atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全。 在多线程环境下,原原创 2016-03-30 16:02:39 · 427 阅读 · 0 评论 -
OC中的extern,static,const
OC中的extern,static,const**const的作用**:const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)。被const修饰的变量是只读的。**static的作用:**修饰局部变量:1.延长局部变量的生命周期,程序结束才会销毁。2.局部变量只会生成一份内存,只会初始化一次。3.改变局部变量的作用域。修饰全局变量1.只能在本文件中访问转载 2016-10-08 08:57:59 · 371 阅读 · 0 评论 -
iOS-NSString
iOS开发,搞定NSString一、初始化方法 1、创建常量字符串 NSString *string1 = @”string”; 2、创建一个空字符串,并赋值 NSString *str = [[NSString alloc] init]; str = @”nullToFull”; 3、initWithCString方法 char *c = “string”; NSString *s转载 2016-10-09 14:50:17 · 267 阅读 · 0 评论 -
几种全局变量的使用方法
在iPhone开发中,使用全局变量有这么几种实现方法:1、在AppDelegate中声明并初始化全局变量 然后在需要使用该变量的地方插入如下的代码://取得AppDelegate,在iOS中,AppDelegat被设计成了单例模式 xxxAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; appDele原创 2016-07-20 16:29:55 · 7307 阅读 · 0 评论 -
NSPredicate
NSPredicate 1)介绍 官方文档:The NSPredicate class is used to define logical conditions used to constrain a search either for a fetch or for in-memory filtering. NSPredicate用于数据的筛选。主要用于两个方法中 NSArray - (N原创 2016-03-21 09:47:42 · 269 阅读 · 0 评论 -
stringByAddingPercentEscapesUsingEncoding: 和stringByReplacingPercentEscapesUsingEncoding:的不同
stringByAddingPercentEscapesUsingEncoding用与将Unicode字符转换成有百分号的形式。 stringByReplacingPercentEscapesUsingEncoding:将百分号形式转换成Unicode形式 例子: NSString *rawText = @”One Broadway, Cambridge, MA”; NSString *e原创 2016-05-02 09:00:52 · 6450 阅读 · 0 评论 -
字符串和int float的相互转化
在obj-c中,字符串使用NSString定义成一个用于保存字符串的对象变量,而数字则使用原始类型float、int定义成一个变量,这是一个原生态的变量。 这两种变量之间在开发时会需要相互转化。 下面是常用的转化方法: NSString *tempA = @”123”; NSString *tempB = @”456”;1、字符串拼接 NSString *newString = [NSS转载 2016-05-06 07:57:36 · 1333 阅读 · 0 评论 -
int,NSInteger,NSUInteger,NSNumber
int,NSInteger,NSUInteger,NSNumber 1.当需要使用int类型的变量的时候,可以像写C的程序一样,用int,也可以用NSInteger,但更推荐使用NSInteger,因为这样就不用考虑设备是32位的还是64位的。 2.NSUInteger是无符号的,即没有负数,NSInteger是有符号的。3.有人说既然都有了NSInteger等这些基础类型了为什么还要有NSN转载 2016-03-21 15:11:21 · 272 阅读 · 0 评论 -
iOS中Category类别基本介绍和使用
转自:http://www.2cto.com/kf/201502/376993.html类别类别是一种为现有的类添加新方法的方式。 利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类。 类别使得无需创建对象类的子类就能完成同样的工作 一、创建类别 1、声明类别原创 2016-03-23 13:27:04 · 311 阅读 · 0 评论 -
对象等同性判断
(1)“==” ==操作比较的是两个指针本身,即对象存放的地址,而不是其所指的对象。应该使用“isEqual:”方法来判断两个对象的等同性。 下面一个例子可以说明==与等同性方法之间的差别 NSString *str1 = @"bound 123"; NSString *str2 = [NSString stringWithFormat:@"bound %@",@"123"]; NSL原创 2017-02-17 14:28:26 · 474 阅读 · 0 评论 -
在既有类中使用关联对象存放自定义数据
有时需要在对象中存放相关信息。这时我们通常会从对象所属的类中继承一个子类,然后改用这个子类对象。然而并非所有情况下都能这么做,有时候类的实例可能是由某种机制所创建的,而开发者无法令这种机制创建出自己所写的子类实例。Objective-C中有一项强大的特性可以解决此问题,这就是“关联对象”(Associated Object)。可以给某对象关联许多其他对象,这些对象通过“键”来区分。存储对象值的时候,转载 2017-02-17 15:22:58 · 420 阅读 · 0 评论 -
OC学习——OC中的@protocol(@required、@optional)、代理设计模式
一、什么是协议? 1.协议声明了可以被任何类实现的方法 2.协议不是类,它是定义了一个其他对象可以实现的接口 3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。 4.协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。 5:委托,就是调用自己定义方法,别的类来实现。 另外: 可以用来声明一大堆方法(不能声明成员变量) 只转载 2016-03-23 15:41:00 · 5294 阅读 · 0 评论 -
iOS 枚举的使用
iOS 枚举可以使用三种关键字定义 (1)使用C语言格式的enum (2)使用NS_ENUM定义 (3)使用NS_OPTIONS来定义位移,具有位移和操作组合的操作 1、使用enumenum{ MyOption0=0, MyOption1, MyOption2,}MyOption;2、使用NS_ENUMtypedef NS_ENUM(NSUInteger,MyOpt原创 2018-01-25 10:12:25 · 469 阅读 · 0 评论 -
刨根问底KVC
最近比较忙,看到关于KVC的文章比较好,本来打算自己写,但是好忙,只能照原作者的搬过来了,但是我自己实现了奥 作者:http://www.cnblogs.com/ioshe/p/5937946.html刨根问底KVC KVC 全称 key valued coding 键值编码反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属转载 2017-07-13 09:15:36 · 519 阅读 · 0 评论 -
iOS #import和#include和@class 区别
*转载请注明出处http://www.cnblogs.com/chenyg32/ @class和#import相似。1.@class用于 forward-class declaration,只能使用@class,复制代码 @class class2@interface class1 { class2* class2Object; }@end@interface class2 {原创 2016-03-14 08:54:33 · 683 阅读 · 0 评论 -
KVC基本使用
Keys key 是一个字符串,它定义了一个对象的一个属性,一个key相当于存取器的名字或者接受者的实例变量Keys必须使用ASCII编码,以小写字母开始不包含空白 例如:name amountKey Paths A key path is a string of dot separated keys that is used to specify a sequenc原创 2016-06-09 13:57:09 · 415 阅读 · 0 评论