|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 21、简述IOS static 关键字的作用? |
| 函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值; 2.在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; 3.在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明 它的模块内; 4.在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝; 5.在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。 |
| |
| 22、@property 后面可以有哪些修饰符? |
| @property后面总的有如下修饰符: readWrite,readOnly,assign,copy,retain; readWrite:系统会自动帮我们生成getter和setter方法; readOnly: 系统只会帮我们生成getter方法; assign:表示直接赋值,适用于基本数据类型:NSInteger和CGFolat copy:使用于NSString,与NSString一起用表示浅拷贝,与NSMutableString表示深拷贝。 retain:使用于除了assign和copy之外的NSObject的子类,例如NSArray,UIView,NSDictionary等 控件用weak修饰,delegate用assign和weak修饰 |
| |
| 23、解释Object-C什么情况使用 weak 关键字,相比 assign 有什么不同? |
| 在ARC中,出现循环引用的时候,必须要有一端使用weak,比如:自定义View的代理属性 已经自身已经对它进行一次强应用,没有必要在强引用一次,此时也会使用weak,自定义View的子控件属性一般也使用weak; 但b是也可以使用strong weak当对象销毁的时候,指针会被自动设置为nil,而assign不会* assigin 可以用非OC对象,而weak必须用于OC对象 |
| |
| 24、 如何Object-C让自己的类用 copy 修饰符? |
| 想让自己所写的对象具有拷贝功能,则需实现 NSCopying 协议。 如果自定义的对象分为可变版本与不可变版本,那么就要同时实现 NSCopying 与 NSMutableCopying 协议。 实现 NSCopying 协议。该协议只有一个方法:- (id)copyWithZone:(NSZone *)zone;。 实现 NSMutableCopying 协议。该协议只有一个方法:- (id)mutableCopyWithZone:(nullable NSZone *)zone; |
| |
| 25、简述如何重写带 copy 关键字的 setter? |
| 重写copy的setter方法时候,一定要调用一下传入的对象的copy方法,然后在赋值给该setter的方法对应的成员变量 |
| |
| 26、 @protocol 和 category 中如何使用 @property? |
| 在protocol中使用property只会生成setter和getter方法声明,我们使用属性的目的,是希望遵守我协议的对象的实现该属性 category 使用 @property 也是只会生成setter和getter方法的声明,如果我们真的需要给category增加属性的实现,需要借助于运行时的两个函数 objc_setAssociatedObject objc_getAssociatedObject |
| |
| 27、Weak属性需要在dealloc中置nil么? |
| 不需要,在ARC环境无论是强指针还是弱指针都无需在deallco设置为nil, ARC会自动帮我们处理 |
| |
| 28、 自动合成属性实例变量后,@synthesize还有哪些使用场景? |
| @synthesize主要就是用来生成setter,getter方法的实现,在@property被增强之后,其实已经很少使用@synthesize了,你知道@synthesize的其他使用场景吗? 能给我介绍一下吗? 如果你听懂了,感觉面试官说的很有道理,可以说点赞美的话. |
| |
| 29、 Object-C中向nil对象发送消息将会发生什么? |
| 在Objective-C中向nil发送消息是完全有效的------只是在运行时不会有任何作用: 如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil)。例如:Person * motherInlaw = [ aPerson spouse] mother]; 如果spouse对象为nil,那么发送给nil的消息mother也将返回nil。 如果方法返回值为指针类型,其指针大小为小于或者等于sizeof(void*),float,double,long double 或者long long的整型标量,发送给nil的消息将返回0。 如果方法返回值为结构体, 发送给nil的消息将返回0。结构体中各个字段的值将都是0。 如果方法的返回值不是上述提到的几种情况,那么发送给nil的消息的返回值将是未定义的。 |
| |
| 30、Objec-C 向对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系? |
| 该方法编译之后就是objc_msgSend()函数调用.如果我没有记错的大概是这样的. ((void ()(id, SEL))(void )objc_msgSend)((id)obj, sel_registerName("foo")); |
| |
IOS面试题object-c 21-30
️ 邪神2024-03-12 15:48