一、自我介绍 简单介绍一下你自己吧 解析:简单介绍下自己的名字,教育背景,现在的工作,做过的项目 二、自我介绍衍生的口头问题 讲讲下你在你项目中做过的优化或者技术难点 解析:介绍了自己封装的一个集picker...在.m文件中不能使用self.ivar = @"aa"; 只能使用实例变量_ivar = @"aa";,而外界想要修改只读属性的值,需要用到kvc赋值[object setValue:@"mm" forKey...:@"ivar"];。...如果你自己写 getter/setter,那 atomic/nonatomic/retain/assign/copy 这些关键字只起提示作用,写不写都一样。...总之,当修饰可变类型的属性时,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。
如何让自己的类用 copy 修饰符?如何重写带 copy 关键字的 setter? 若想令自己所写的对象具有拷贝功能,则需实现 NSCopying 协议。...这时候有两种选择: 要么如第14行:手动创建 ivar 要么如第17行:使用@synthesize foo = _foo; ,关联 @property 与 ivar。...类对象中也有一个isa指针指向它的元类(meta class),即类对象是元类的实例。元类内部存放的是类方法列表,根元类的isa指针指向自己,superclass指针指向NSObject类。...这也就是为什么说“不推荐在 init 方法中使用点语法”,如果想访问实例变量 iVar 应该使用下划线( _iVar ),而非点语法( self.iVar )。...点语法( self.iVar )的坏处就是子类有可能覆写 setter 。假设 Person 有一个子类叫 ChenPerson,这个子类专门表示那些姓“陈”的人。
@property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的 @property 的本质是什么?...@protocol 和 category 中如何使用 @property 在 protocol 中使用 property 只会生成 setter 和 getter 方法声明,我们使用属性的目的,是希望遵守我协议的对象能实现该属性...@dynamic 告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成。(当然对于 readonly 的属性只需提供 getter 即可)。...实例变量 = 成员变量 = ivar 如果使用了属性的话,那么编译器就会自动编写访问属性所需的方法,此过程叫做“自动合成”( auto synthesis)。...类对象中也有一个isa指针指向它的元类(meta class),即类对象是元类的实例。元类内部存放的是类方法列表,根元类的isa指针指向自己,superclass指针指向NSObject类。
(这一概念已经定型,并且经由“属性”这一特性而成为Objective-C 2.0的一部分)开发者可以令编译器自动编写与属性相关的存取方法。...二、属性的生成: 1、@synthesize: 默认情况下@property是用@synthesize(合成)修饰的(即默认实现:@synthesize name = _name),自动生成 ivar...时,会屏蔽自动生成 重写了父类属性时,会屏蔽自动生成 2、@dynamic: 还有一个修饰符是@dynamic(动态),即不需要自动生成(有自己实现或运行时动态绑定),但是如果调用时没有实现,则会crash...(如:NSArray的objectAtIndex:就不是线程安全的,需要加锁等确保安全) nonatomic非原子性访问: 就是去掉了atomic为存取方法添加的锁,即其getter和setter方法不是线程安全的...即:[weakSelf someMethod]和[strongSelf someMethod]的区别,其实上一条已经说明了(但是当那个面试官突然这么问时,我脑子没转过来>_<)。
setter、getter 方法(readwrite、readonly) // 情况 1 readwrite,必须要同时编写 setter、getter 方法 @property (nonatomic...setter 、getter 方法必须要严格按照 存取方法的命名要求进行编写: setter --> setValueName: getter --> valueName 不然在调用属性存取方法的时候..._age); } @end 那个警告明显是说,我自动合成的实例变量是__age,而不是 _age,所以你应该定义一个 __age 的实例变量才对,不然我就警告你; 其实这里是间接地证明了,如果你自己定义了相应的带下划线的实例变量...同样地,添加 @synthesize age = _age; 即可; 当然,它是没有 setter 方法的,你也想要有,也可以任性地自己写一个,但是 readonly 为什么不改成 readwrite...C 字符串形式的实例变量的变量名 */ OBJC_EXPORT const char *ivar_getName(Ivar v) OBJC_AVAILABLE(10.5, 2.0, 9.0
最后举例说明KVC使用的场景和高级应用。 01 前言 在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?...由此我的Runner探索之旅开始了!...(流程中的边界判断等已经忽略,如想了解可以参考源码,本文只探究主流程。)...setter) Ivar ivar = NULL; if ((ivar = DSKeyValueIvarForPattern(self, "_%s", key_cstr)...DSKeyValueSetter对象已经生成,即确定了发送消息的对象object、访问器方法名SEL、访问器函数指针IMP、以及使用KVC时传入的Key和Value。
成员变量(Ivar)的数据结构 在Objective-C中,成员变量即Ivar类型,是指向结构体struct objc_ivar的指针,在Objc/runtime.h 中查到,如下所示: typedef...本质上,一个属性一定对应一个成员变量,但是属性又不仅仅是一个成员变量,属性还会根据自己对应的属性特性的定义来对这个成员变量进行一系列的封装:提供 Getter/Setter 方法、内存管理策略、线程安全机制等等...(id obj, Ivar ivar),获得对象的指定成员变量的值。...调用后需要自己 free(); 运行时操作成员变量和属性的示例代码 NSString * runtimePropertyGetterIMP(id self, SEL _cmd){ Ivar ivar...Panda; 然后为它动态添加了 Ivar:_runtimeProperty、对应的 Property:runtimeProperty、对应的 Getter/Setter方法:runtimeProperty
如(NSInteger、CGFloat、int等) copy:建立一个索引计数为1的对象,然后释放旧对象,对实行了NSCopying协议的对象类型有效(NSString、NSDictionary、NSArray...readwrite:可读写,默认属性 何为原子性访问?...何为堆和栈? Objective-C对象所占内存总是分配在“堆空间”,且堆内存由开发者释放,即release; 由编译器管理自动释放的,在方法中定义的变量通常在栈内。...2.简单,栈对象有自己的生命周期,你永远不可能发生内存泄露。...堆对象: 优点:可以自己控制对象的生命周期。 缺点:需要程序员手动释放,容易造成内存泄漏。
所有的元类最终继承一个根元类,根元类isa指针指向本身,形成一个封闭的内循环 superclass指向该类的父类, 如果该类已经是最顶层的根类(如 NSObject 或 NSProxy),那么 super_class...有趣的是根元类的超类是NSObject,而isa指向了自己,而NSObject的超类为nil,也就是它没有超类。...消息普通转发 7、首先runtime发送methodSignatureForSelector:消息 生成Selector对应的方法签名,即参数与返回值的类型信息。...派生类在被重写的 setter 方法实现真正的通知机制,就如前面手动实现键值观察那样。这么做是基于设置属性会调用 setter 方法,而通过重写就获得了 KVO 需要的通知机制。...然后系统将这个对象的 isa 指针指向这个新诞生的派生类,因此这个对象就成为该派生类的对象了,因而在该对象上对 setter 的调用就会调用重写的 setter,从而激活键值通知机制。
基础数据结构 成员变量(Ivar)的数据结构 在Objective-C中,成员变量即Ivar类型,是指向结构体struct objc_ivar的指针,在Objc/runtime.h 中查到,如下所示:...typedef struct objc_ivar *Ivar; 结构体struct objc_ivar的数据结构如下所示: struct objc_ivar { char *ivar_name...本质上,一个属性一定对应一个成员变量,但是属性又不仅仅是一个成员变量,属性还会根据自己对应的属性特性的定义来对这个成员变量进行一系列的封装:提供 Getter/Setter 方法、内存管理策略、线程安全机制等等...push #pragma clang diagnostic ignored "-Wundeclared-selector" //1、Add property and getter/setter...Panda; 然后为它动态添加了 Ivar:_runtimeProperty、对应的 Property:runtimeProperty、对应的 Getter/Setter方法:runtimeProperty
Runtime 理解介绍的文章非常多,我只想讲讲Runtime 可以用在哪里,而我在项目里哪些地方用到了runtime。多以实际使用过程为主,来介绍runtime的使用。...不能添加属性的根本原因是不会帮我们自动添加对象的实例变量,也不会帮我们生成set 和get方法,虽然set /get 方法可以自己实现,但是没有实例变量来存储数据。 ?...通常来说该属性应该是常量、唯一的、在适用范围内用getter和setter访问到,所以通常我们这样写: static char kAssociatedObjectKey; objc_setAssociatedObject...关于Associated Objects的使用,有两个为Category扩展功能,使得Category中也能方便的添加属性以及相应的getter 和setter 的例子。...OC 自动生成分类属性方法 一个库--DProperty 4.运行时动态创建一个类 我在某控制器中测试写了这么一个方法,来创建一个MyClass 类。项目中并不存在叫MyClass 的类文件。
撕开让我看看引导消息公众号首图.jpg Runloop和线程的关系 1....即让自己写的对象具备拷贝功能 具体步骤: 1、需声明该类遵从NSCopying 或 NSMutableCopying协议2、实现 NSCopying 协议。...ivar、getter、setter如何生成并添加到这个类中的 本质:@property = ivar + getter + setter;(实例变量+getter方法+setter方法)在编译期自动生成...,那么编译器会自动为你加上这两个方法 3、@dynamic告诉编译器∶属性的setter 与 getter方法由用户自己实现,不自动生成。...同时重写了setter和getter时,系统就不会生成ivar,使用@synthesize foo =_foo;关联@property 与ivar 重写了只读属性的getter 时 使用了@dynamic
在我观念转变之前 我有两个编码习惯让你们中的一些人觉得很奇怪: 对于一个属性,我更倾向于通过它的 ivar 进行访问。 当然,我也没有使用点符号。 有人说,"访问属性时一定要使用 self."。...我不同意这种说法,因为如果自定义了 setter 或 getter,就很容易切换。没什么大不了的。...但我不知道的是,直接操作 ivar 并不会触发 KVO。如果要使用 KVO,类必须使用setter来操作自己的属性。因此,我的直接 ivar 操作实际上阻止了其他人在我的类上使用 KVO。 这样不好。...如果你要使用我的课程,我不想因为我碰巧用某种方式编码,就切断你与编程工具的联系。 属性链接了 self. 所以只能 "使用自己的setter"。我不想用一种样式来设置值,而用另一种样式来获取值。...因此,"使用自己的getter "也就顺理成章了。 但我不喜欢 [[self prop] doSomething]; 突然间,我明白了 "使用自己的属性 "的意思,如果我采用self.
,能够给类对象添加方法而不需要创建子类),非正式协议的方法是可选的 正式协议: 一个正式协议声明了类需要实现的方法列表,正式协议有自己的声明、采用和类型检查语法。...,也是我所能想到的: 如何动态生成一个类??...知道了原理,能不能自己写一个KVO?? 动态生成一个自己的类 既然是动态生成,肯定是利用了苹果的runtime机制,通过上面对KVO的学习,也了解到了runtime的强大之处。...自己动手写一个KVO KVO底层实现还是很复杂的,下面我只是简单的写下实现过程: 因为它是一个非正式协议,给NSObject新建一个Category,NSObject+kvo.h,添加监听方法: .h文件...@表示参数类型,是一个对象 下面在代码中实验,看下我们自己写的kvo有没有执行: 修改添加监听者的方法,改成我们自己的 [self.person zj_addObserver:self forKeyPath
也就是说,有很多类和成员变量在我们编译的时是不知道的,而在运行时,我们所编写的代码会转换成完整的确定的代码运行。...我将会参考苹果官方的 API 文档。 ---- 一些 Runtime 的术语的数据结构 要想全面了解 Runtime 机制,我们必须先了解 Runtime 的一些术语,他们都对应着数据结构。...而根元类的父类是 NSObject,isa指向了自己。而 NSObject 没有父类。...类中有一个实例方法:methodForSelector,你可以用它来获取某个方法选择器对应的 IMP ,举个例子: void (*setter)(id, SEL, BOOL); int i; setter...如果我们使用关键字 @dynamic 在类的实现文件中修饰一个属性,表明我们会为这个属性动态提供存取方法,编译器不会再默认为我们生成这个属性的 setter 和 getter 方法了,需要我们自己提供。
我曾在项目中做过苹果APNs的改造和优化,很多细节点在网上找的资料都是一会这样一会儿那样,最后还是通过通读苹果APNs的官方文档才明确。...现在我就以查找KVC官方文档为例,演示一下如何在苹果官方文档中找到想要的内容。...(获取到的是NSValue类型,需要自己转成自定义结构体类型) NSValue *laVieValue = [norman valueForKey:@"lavie"]; LavieStruct lavie666...实际上,关于KVC设置与取值的过程,我在KVC详解(上)中有过详细说明,不过之前的文章中有些地方有些遗漏,我在这里补充说明下。 ?...上图是之前文章中总结的KVC设值的流程,其中第一步中的setter方法有两个,先走setKey方法,没有的话再走_setKey方法,都没有的话就进入上图中的第2步。 ?
(所以尽量不起同名的方法,除非是故意想覆盖) Category中声明的属性,只会生成setter和getter的声明,不会实现setter、getter和成员变量 如: // MOPerson+Fitness.h...Category有名字,Extension没有 Category声明的属性,不会自动生成ivar、setter、getter Extension可以添加实例变量,Category不可以 Extension...分类不是类没有自己的isa,只会将自己的methodattach到主类,并不会影响到主类的IvarList`。 ...objc_method_list的结构体(可以修改另一个指针,即*methodLists的值来增加成员方法,虽不能扩展methodLists指向的内存区域,却可以改变这个内存区域的值);Runtime时...可以添加属性,只是系统不会自动为Category中的属性实现setter和getter方法;因为不能添加实例变量,所以需要通过runtime动态绑定的方式,实现setter和getter方法。
结构指针,类对象的指针指向其所属的类,即元类。...也就是说基类的元类的isa指针指向他自己。...简单来说属性是添加了存取方法的成员变量,也就是: @property = ivar + getter + setter; 因此,我们每定义一个@property都会添加对应的ivar, getter...具体来说,系统会在objc_ivar_list中添加一个成员变量的描述,然后在methodLists中分别添加setter和getter方法的描述。...,这种方式只适用于极特殊的优化场景,如效率敏感的场景下大量循环的调用某方法。
给对象设置关联属性 @param object 需要设置关联属性的对象,即给哪个对象关联属性 @param key 关联属性对应的key,可通过key获取这个属性, @param value 给关联属性设置的值...当我们需要持续大量重复调用某个方法的时候,会十分有用,具体代码示例如下: void (*setter)(id, SEL, BOOL); int i; setter = (void (*)(id, SEL...基本思路:首先使用Runtime获取Peson对象的所有属性,找到nickName,然后使用ivar的方法修改其值。...字典数据转模型的操作在项目开发中很常见,通常我们会选择第三方如YYModel;其实我们也可以自己来实现这一功能,主要的思路有两种:KVC、Runtime,总结字典转化模型过程中需要解决的问题如下: 字典转模型...与模型属性不匹配的问题,如id->uid id anotherName = perpertyTypeDic[propertyName]; if(anotherName &
领取专属 10元无门槛券
手把手带您无忧上云