ios的一些基本知识



1.NSInteger和int的区别

 

#if __LP64__ || (TARGET_OS_EMBEDDED&& !TARGET_OS_IPHONE) ||TARGET_OS_WIN32 ||NS_BUILD_32_LIKE_64
typedeflongNSInteger;
typedefunsigned longNSUInteger;
#else
typedef intNSInteger;
typedefunsigned intNSUInteger;
#endif

 

这是对NSInteger的定义,对于不同平台32、64位有不同的最大值,可以直接转化

 

2.readonly  retain assign  copy nonatomicatomic的区别

readonly

只读属性,不生成setter方法

 

retain的setter函数是这样子的:

if (property !=newValue) {
[property release];
property = [newValueretain];
}
释放了旧对象,再把新值赋给属性,输入对象newValue的引用计数加1,属于指针拷贝,共享一个指针,添加了引用计数

 

copy的setter函数:

if (property!= newValue) {
[property release];
property = [newValuecopy];
}

 

释放了旧对象,再把新值copy给了属性,属于内容拷贝,直接将指针copy了一份,不与其共享一个指针,添加了引用计数

 

assign是直接赋值,没有引用计数。

举个例子,比如assign和retain的区别:

你用malloc分配了一块内存,并且把他的地址赋给了指针a,后来你也想让b(assign属性)共享这块内存,这样子a和b就共享一块内存了,当a不再使用的时候就不能释放掉a,因为a和b共享一块内存,如果你把a给释放掉了,就是相当于把这块内存给释放了,这时如果你使用b的话,程序就会崩溃的,因为b的指针已经被释放了。

所以assign与retain的区别是retain加入了引用计数,当你a和b都是retain属性的时候,如果你把a赋给了b,a就又多了一个引用,这样a的引用计数就是2,b的引用计数是1,当a不再使用这块内存的时候,你releasea,这样a的计数就变为1,b的计数也是为1,但是他们是共享一块内存的,当b也不再使用的时候,你将b给释放了,a也一起被释放掉。

copy与retain都使用引用计数,只是拷贝内容不同,比如一个NSString对象,地址为0x111,copy到另一个NSString的时候,地址为0x222,内容就一定相同,这样两个对象就独立占有各自的内存块。

 

 

nonatomic

非原子性,不同步,提高多线程并发访问性能

 

atomic

属性默认是atomic属性,线程安全

 

 

3.委托

在大部分源码中基本都能看到委托的存在,委托主要运用在界面传值还有传事件。

传值:

比如你要从界面A跳转到界面B,带个参数p,这样你就可以定义一个委托,定义一个方法,在界面A中声明一个委托的对象id,调用方法将值穿进去,在界面B实现委托,并实现委托的方法。这样大概的一个原理就是我显示B的时候,B要求A要带个参数给他,就将A设置为委托对象,A在实现界面跳转的时候把参数带进去,B就可以跟委托的方法获取到这个参数。就相当于实际生活你要买房子找中介,这个中介就是委托。

 

传事件:

框架中很多控件绑定数据或者触发事件都使用委托,比如UItableView、UIPickerView等等控件要使用是样的数据或者点击要实现什么,都交给了委托去处理,不用自己去处理。

 

委托中声明属性的时候要用assign,不能用retain,因为委托无法释放对象,我们就直接给他赋值就可以了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值