Men的博客

欢迎光临!

0%

OC语言相关

OC为什么说是一门动态语言

Objective-C 可以通过Runtime 这个运行时机制,在运行时动态的添加变
量、方法、类等,所以说Objective-C 是一门动态的语言
Objective-C的动态性,让程序在运行时判断其该有的行为,而不是像c等静
态语言在编译构建时就确定下来。它的动态性主要体现在3个方面:
1.动态类型:如id类型。实际上静态类型因为其固定性和可预知性而使用的特
别广泛。静态类型是强类型,动态类型是弱类型,运行时决定接收者。
2.动态绑定:让代码在运行时判断需要调用什么方法,而不是在编译时。与其他
面向对象语言一样,方法调用和代码并没有在编译时连接在一起,而是在消息发
送时才进行连接。运行时决定调用哪个方法。
3.动态载入。让程序在运行时添加代码模块以及其他资源。用户可以根据需要执
行一些可执行代码和资源,而不是在启动时就加载所有组件。可执行代码中可以
含有和程序运行时整合的新类。

类方法(静态方法)和实例方法(动态方法)区别

类方法必须使用类调用,存储在元类结构体里面的methodLists里面
实例方法必须使用实例对象调用,存储在类结构体里面的methodLists里面
静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,
所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速
度很快,但是多了会占内存。
静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,
所以当然没有静态方法快,

ios中定义属性了解

@property = ivar + getter + setter
实例变量+get方法+set方法 也就是说使用@property系统会自动生成setter和getter方法,
nonatomic 非原子性操作,不提供线程安全,效率更高
nonatomic 非原子性操作,不提供线程安全,效率更高
strong 在赋值的时候调用被只想对象的retuain方法,使其引用计数加1
weak 不增加对象的引用计数,也不持有对象,对象消失后,指针自动变为nil
assign 不更改引用计数,修饰基础数据类型
copy 简历一个引用计数为1的对象,常用于NSString和block
readonly 只读属性
readwrite默认属性 可读可写
@synthesize:编译期间,让编译器自动生成setter方法和getter方法
@dynamic  不自动生成,自己手动生成

NSString为什么要用copy修饰

因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受
外界影响,使用copy无论给我传入的是一个可变的对象黑市不可变的对象,我
本身持有个就是一个不可变的副本
如果我们使用的是strong,那么这个属性就有可能指向一个可变对象,如果这
个可变对象在外部被修改了,那么会影响该属性

如何让自己的对象具有拷贝功能

需要遵守NSCopying协议,如果自定义的对象分为可变和不可变版本,那么要
同事细心啊NSCopying和NSMutableCopying协议
copy和mutableCopy区别
针对不可变对象调用copy返回该对象本身,调用mutableCopy返回一个可变对象(新的)
针对可变对象调用copy返回一个不可变对象(新的),调用mutableCopy返回
另外一个可变对象(新的)。
copy:创建的是不可变副本(NSString,NSArray,NSDictionary)
mutableCopy:创建的是可变副本(NSMutableString,
NSMutableArray,NSMutableDictionary)
深拷贝(mutableCopy)就是内容拷贝,即指拷贝对象的具体内容,而内存地址
是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不
一样,两个对象也互不影响,互不干涉;浅拷贝(copy)就是指针拷贝,即对内存
地址的复制,让目标对象指针和源对象指向同一片内存空间。

为什么IBOutlet修饰的UIView也适用weak关键字

因为既然有外链那么试图在xib中可定存在,试图已经对他有一个强引用了,使
用storeboars创建的vc会有一个私有数组前引用所有的对象

使用descperction注意什么

千万不要在description方法中同时使用%@和self,同时使用了%@和self,
代表要调用self的description方法,因此最终会导致程序陷入死循环,循 环
调用description方法
当该方法使用NSLog(“%@”,self) 时候, 系统做了相关的优化,循坏调用3
次后就会自动退出

什么时候会报unrecognized selector错误

出现unrecognized selector类型的crash,一般是向对象发送了无法处理
的消息导致的。说白一点就是这个对象没有你调的那个方法,为什么运行的时候
才会出现,这个和OC语言动态绑定的机制有关系。
对象未实现该方法。
对象已经被释放。

iOS常见错误

数组越界
向容器存入nil