value) NSDictionary中的键(key)是单值,通常是字符串,也可以是其他对象类型 NSDictionary中和键(key)关联的值(value)可以是任何对象类型,但不能是nil NSDictionary...是不可变的,一旦初始化完毕,里面的内容就无法修改 2.NSDictionary的创建 + (instancetype)dictionary; + (instancetype)dictionaryWithObject...NSMutableDictionary 1.NSMutableDictionary介绍 NSMutableDictionary是NSDictionary的子类 NSDictionary是不可变的,一旦初始化完毕后...,它里面的内容就永远是固定的,不能删除里面的元素,也不能再往里面添加元素 NSMutableDictionary是可变的,随时可以往里面添加\更改\删除元素 2....NSMutableDictionary的常见操作 添加/修改一个键值对(如果aKey之前有值,则会把aKey之前对应的值给替换掉)- (void)setObject:(id)anObject forKey
NSString是OC中最常用的1个类了,所以OC提供了一种更为快速的创建字符串对象的方式:使用前缀@ @"jack";本质上这是1个NSString对象,这个NSString对象中存储的是"jack...当在内存中创建1个字符串对象以后,这个字符串对象的内容就无法更改,当我们重新为字符串指针初始化值的时候,并不是修改原来的字符串对象,而是重新的创建1个字符串对象并将这个字符串对象的地址重新复制给字符串指针变量...到遇到不能转换的时候就停止转换. 去掉字符串前后的空格,中间的空格无法去掉。...NSArray是不可变得,一旦初始化完毕之后,它里面的元素就永远是固定的,无法删除和新增元素 NSArray的创建 + (instancetype)array; // 创建一个没有任何元素的数组 + (...NSDictionary字典一旦创建完毕,其键值对的个数就已经固定,无法删除,新增。
然后,提供了来增加和删除这个set里的元素的公共接口。...然而有时,我们需要在更改set数据的同时要执行隐秘在实现文件里的其他工作,那么如果在外部随意更改这个属性的话,显然是达不到这种需求的。...对于返回值是布尔值的方法,我们也要注意命名的规范: 获取”是否“的布尔值,应该增加“is”前缀: - isEqualToString: 获取“是否有”的布尔值,应该增加“has”前缀: - hasPrefix...第48条:多用块枚举,少用for循环 当遍历集合元素时,建议使用块枚举,因为相对于传统的for循环,它更加高效,而且简洁,还能获取到用传统的for循环无法提供的值: 我们首先看一下传统的遍历: 传统的for...", self); } } 这样一来,EOCBaseClass的子类EOCSubClass就无法再调用initialize方法了。
10.5、NSString和NSArray上的类方法无法存根或验证 10.6、NSManagedObject的类方法及其子类无法存根或验证 10.7、无法验证 NSObject 上的方法 10.8、无法验证核心...OCMock知道KVO,并小心避免与之发生冲突 对于其它框架,OCMock仅提供了一种选择退出模拟以免发生意外行为的机制 + (BOOL)supportsMocking:(NSString **)reason...当开发人员尝试为此类创建模拟程序时,将引发异常,解释问题说在 该方法在单独调用中返回不同的值是可以接受的,这使它在运行时对特定条件做出反应 如果该方法为reason赋值,返回值将被忽略 对于所有未实现此方法的类...toll-free bridged 类的实例创建局部模拟 无法为 某些实例创建以标记指针表示的对象,如:NSString、在某些体系结构上、NSDate在某些体系结构上 10.4、某些方法无法存根或验证...上的类方法无法存根或验证 // 无法生效、该方法将不会被存根 id stringMock = OCMClassMock([NSString class]); // 无法在NSString和NSArray
点击搜索后,停止编辑后,系统的单航条就会出现,而且通过代理来手动隐藏是无法做到的,所以,在使用 UISearchBar & UISearchDisplayController时不要使用自定义的导航条,...UIDatePicker 这个时间选择器的显示,会随着手机的语言设置而不同,对于用模拟器的小伙伴,默认的显示样式是英文的,当把模拟器的语言设置成简体中文时就变成这样了 ?...控件都是全局变量,后续需要设置的情况下就放弃了 For循环,转而一个个地去实现,其实我们大可以继续使用for 循环,在循环中生成一个局部变量,把这个局部变量设置好,加载上,最后对于不同的 i 下把这个局部变量的指针赋值给...、center等等 options: 有4个值,分别是: NSKeyValueObservingOptionNew 把更改之前的值提供给处理方法 NSKeyValueObservingOptionOld...把更改之后的值提供给处理方法 NSKeyValueObservingOptionInitial 把初始化的值提供给处理方法,一旦注册,立马就会调用一次。
如果我更改了一个属性的值,KVO会帮助我们检测这个值的变化,从而通知我们这个值改变了。典型的观察者模式。...我曾经实现了一个inspector的编辑器类,值改变直接通知(其实是调用)对应的函数。在iOS这里 一切发生的那么自然。不需要额外实现 这是iOS的特性之一 名曰:KVO 。...,这里不需要处理所以填写0,详细的选项如下: NSKeyValueObservingOptionNew 把更改之前的值提供给处理方法 NSKeyValueObservingOptionOld...把更改之后的值提供给处理方法 NSKeyValueObservingOptionInitial 把初始化的值提供给处理方法,一旦注册,立马就会调用一次。...即使禁止了自动通知也可以直接在get函数中触发。
UserInfo 的值,是发送通知时所携带的参数) NSArray *notifiArray = [[UIApplication sharedApplication] scheduledLocalNotifications...]; for (UILocalNotification *local in notifiArray) { //将来可以根据UserInfo的值,来查看这个是否是你想要删除的通知 if (...@property(nullable, nonatomic,copy) NSString *alertAction; 锁屏界面默认的是回复来查看 ?...,最小单位是分钟,0代表不重复,如果此属性设置了, 那么调度池不会用完释放!...案例结构,tabBarController的索引分别为0 1 2 1、接收到本地通知后调用(AppDelegate中),该方法只有程序前台或后台的时候才有用,退出无法接收到消息即无法跳转,如需要在程序退出时推送通知
这里要注意的一点是,滑动条的高度,如果设为0,其实还是会正常显示。但是!一旦高度设为0,滑动条将不能左右滑动!我就入过这个坑。。。找了半天没找到原因,最终发现是这里的问题。...如上所示,在代码中,我们设置了最大值、最小值、当前值。...也可以改变滑动条左边、右边一集滑块本身的颜色,不过我们这里采用默认的设置,更改方法代码中也写了。除了可以设置颜色外,还可以设置最大最小值处的图片。...的值并不是直接定义的,而是获取滑动条的最大、最小、当前值,然后取小数点前一位显示的,因为滑动条是连续变化的,其值是浮点型的连续小数,如果不取小数点后的位数,得到的将是没有规律的小数。...3.现在来看拖动滑动条时的响应方法: 我们要做到的是当前值的label显示的内容随着滑动条的滑动而变化,那么只需要在滑动条的响应方法中设置label的显示内容就可以了,注意同样要取小数点前一位: //
如果该属性是一个对象,则直接提供该值。如果该属性是标量或C结构,则该值将包装在一个NSValue对象中(与键值编码一样)。...如果您为每个关键路径提供了唯一的上下文,如下所示,一系列简单的指针比较会同时告诉您该通知是否适用于此观察者,如果是,那么哪个关键路径发生了变化。...通常,如果遵循标准的Cocoa编码和命名约定,则可以使用自动更改通知 - 不必编写任何其他代码。 手动更改通知提供了何时发出通知的额外控制,并且需要额外的编码。...自动发出通知 NSObject提供了自动键值更改通知的基本实现。 自动键值更改通知通知观察者使用键值兼容访问器所做的更改以及键值编码方法。...手动更改通知提供了执行此操作的方法。 手动和自动通知不是相互排斥的。除了已有的自动通知外,您还可以自由发布手动通知。更典型的是,你可能想完全控制一个特定属性的通知。
---- 一、介绍 1.在iOS中,有2个框架可以访问用户的通讯录: AddressBookUI.framework 提供了联系人列表界面、联系人详情界面、添加联系人界面等 一般用于选择联系人 AddressBook.framework...实例 第2个参数ABPropertyID是属性关键字,定义在ABPerson.h中,下面有介绍 注意:使用ABRecordCopyValue可以从一条Person记录中获取到对应的值,但是后续还需要根据值的具体类型再加以处理...(比如简单属性取的值不需要再处理,多重属性的值还需要通过其它函数再取值) ---- ABPropertyID联系人属性介绍 ABPropertyID 就是联系人的属性,所有的属性常量值都定义在了ABPerson.h...kABPersonAddressProperty (3)多重属性:电话号码 kABPersonPhoneProperty 、电子邮件 kABPersonEmailProperty 等 联系人的有些属性值就没这么简单...打印查看标签和值 // 获取电话,电话是多数据类型 ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty
属性概念 属性是OC的一项特性,用于封装对象中的数据 OC对象通常会把其所需要的数据保存为各种属性 属性通过存取方法来访问(setter、getter) 例如:在Person类中定义了2个属性 通过...(NSString *)lastName; - (NSString *)lastName; @end 访问属性时,可以使用点语法,是一个编译器的特性,编译器会把“点语法”转换为对存取方法的调用,使用点语法和直接调用存取方法的效果一致...,会出现无法预料的结果,一般属性设置都是nonatomic,因为iOS中使用同步锁的开销比较大,会影响性能 读写权限 readwrite:属性拥有getter、setter方法 readonly...: 属性拥有getter方法 内存管理关键字 assign:用于修饰数值类型,是简单赋值操作 strong:为这种属性设置新值时,设置方法会先保留新值,并释放旧值,然后再把新值设置过去 weak...(当属性类型为NSString时,经常用copy,因为传递给设置方法新值有可能指向一个NSMutableString类的实例,这个类是NSString的子类,若不拷贝字符串,那么设置完属性后,字符串的值就可能会在对象不知情的情况下被人更改
本书是iOS程序员入门的必读书籍,它讲述了在iOS开发中(Objective-C语言)可以遵循的规范和一些开发技巧。...同等性判断 ==操作符比较的是指针值,也就是内存地址。 然而有的时候我们只是想比较指针所指向的内容,在这个时候,就需要通过isEqual:方法来比较。...有时,我们无法确定在某个操作后引用计数的确切值,而只能判断这个操作是递增还是递减了保留计数。 2....使用举例:如果我们想释放当前需要使用的方法返回值是,可以将其暂时放在自动释放池中: - (NSString*)stringValue { NSString *str = [[NSString...,NSArray,NSDictionary等 CFoundation框架:C语言API,Foundation框架中的许多功能,都可以在这里找到对应的C语言API CFNetwork框架:C语言API,提供了
1.ARC空声明变量 使用ARC的另一个优势是所有未初始化的变量默认都是“空值化”的。...这意味着像下面这样的声明使用ARC编译后指向的是空值(nil): NSObject *myObject1,*myObjects2; 不过要注意的是,与其他高级编程语言不同,ARC不会自动将标量的值设置为零...3.覆盖默认行为 虽然从技术上说我们无法覆盖LLVM的行为,但还是可以使用Clang源标注NS_RETURNS_RETAINED和NS_RETURNS_NOT_RETAINED来更改方法。...也就是说,我们可以将CFString*通过类型转换变成NSString*类型。而有了ARC,我们便无法再这么做了,至少不指定一个所有权转移修饰符时确实如此。 ...__bridge 它告诉ARC不要增加它的引用计数的值,也不要更改所有权。 2.__bridge_retained 若想要转换C指针类型并增加引用计数的值,我们可以使用第二个修饰符。
statusBarStyle = UIStatusBarStyleDarkContent; } UITextFiled UITableView UIAlertController等控件莫名其妙的就变黑了...解决方案:每个UIView都做修改是不现实的,统一的实现方式为: 在plist文件中增加配置项UIUserInterfaceStyle,值为UIUserInterfaceStyleLight。...5.KVC获取状态栏(_statusBar)会导致崩溃,目的是为更改状态栏背景色 ?...DeviceToken字符串了,iOS 13 通过[deviceToken description]获取到的内容已经变了。...原因:因为使用LaunchImage来设置启动图,要求我们必须提供各种屏幕尺寸的启动图,来适配各种设备,相对而言比较麻烦,使用 LaunchScreen的话,情况会变的很简单。
Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式,也可以说属性为我们提供了一个默认的设置器和访问器的实现。... 因为要用protected 或者 private来隐藏类的内部细节,用类或者对象是没法直接访问被隐藏的细节的,所以要用getter和setter来访问被隐藏的实例变量,OC中的属性机制就为我们提供了默认的...@property int idNumber; //定义其他方法 @end 2.属性的实现 在实现文件中我们用@synthesize来实现,用@synthesize来修饰相应的变量就起到类...property的可读写性 property的可读写性决定属性是否有setter方法 (1)readwrite : 指定属性是可读写的,这是默认值...中的语义 :决定了以何种方式对数据成员赋予新值 strong : 表示强引用关系,即拥有对象的所有权。
如此操作后和能会由于竞态使得部分情况外部可以修改属性值,外部也可通过KVC来更改属性值 ---- 4.将类的实现代码分散到便于管理的数个分类之中 通过分类机制,可以把类代码分成很多个易于管理的小块,...另外performSelector返回值只能是id类型的对象,基本数据类型可能需要开发人员进行进一步的类型转换。 如果想要添加延时任务,条件允许的情况下应尽可能选择GCD。...与快速遍历法相比,他还要多用一些代码,可是却能提供遍历时所针对的下标,在遍历字典时也能同时提供键与值,而且还有选项可以开启并发迭代功能,所以多写这点代码还是值得的。...由于此方法遵从普通的覆写机制,所以通常应该在里面判断当前要初始化的是哪个类。...无法在编译器设定的全局常量,可以放在+initialize方法里初始化。 好的,今天的内容就到这里了,有什么问题可以来老司机的个人博客、GitHub
iOS开发之AddressBook框架详解 一、写在前面 首先,AddressBook框架是一个已经过时的框架,iOS9之后官方提供了Contacts框架来进行用户通讯录相关操作。...尽管如此,AddressBook框架依然是一个非常优雅并且使用方便的通讯录帮助库。本篇博客只要总结AddressBook框架的相关使用方法。 ...//可以进行使用 } //释放内存 CFRelease(addressBookRef); }); } ABAuthorizationStatus是授权状态的枚举...kABAuthorizationStatusNotDetermined = 0, // 尚未申请过授权 kABAuthorizationStatusRestricted, // 授权被限制 无法使用...相关的其他常用函数: //存储通讯录 bool ABAddressBookSave(ABAddressBookRef addressBook, CFErrorRef* error); //获取通讯录是否有未保存的更改
三.OPEN UDID 第三方最出名的莫过于此了,但是iOS7这货也无法使用了,由于iOS7对剪贴板(OpenUDID保存到剪贴版中)的限制,导致同一个设备上应用间,无法再共享一个OpenUDID。...ASIdentifierManager单例提供了一个方法advertisingIdentifier,通过调用该方法会返回一个上面提到的NSUUID实例。...作为账号了 idfv:顾名思义,是给Vendor标识用户用的,每个设备在所属同一个Vender的应用里,都有相同的值。...这两个BundleID来说,就属于同一个Vender,共享同一个idfv的值。...BundleID来说,就属于同一个Vender,共享同一个idfv的值。
KVO 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。... [stockForKVO release]; } 四,小结 KVO这种编码方式使用起来很简单,很适用与datamodel修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后...遍历出name这个key,去模型中查找有没有setName:方法,找到就直接调用,给模型的成员属性赋值。...//通过person自己的函数来更改name 48. [p changeName]; 49. 50. 结果是 51. ...最后一次修改是直接修改 所以没法产生通知 四,小结 KVO/KVC这种编码方式使用起来很简单,很适用与datamodel修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后
领取专属 10元无门槛券
手把手带您无忧上云