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
readonly
只读属性,不生成setter方法
retain的setter函数是这样子的:
if
}
释放了旧对象,再把新值赋给属性,输入对象newValue的引用计数加1,属于指针拷贝,共享一个指针,添加了引用计数
copy的setter函数:
if
}
释放了旧对象,再把新值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等等控件要使用是样的数据或者点击要实现什么,都交给了委托去处理,不用自己去处理。