IOS学习之知识大汇总
2014-04-11 10:15
351 查看
转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/23425901
作者:小马
该博客持续更新中,用于记录平时开发过程中遇到的问题,查到的资料汇总。仅限于一些小的知识点,不涉及大的源码工程,主要是一些编程规范,语法注意点,xcode使用等。
一 关于 class extension
下面这种用法, 头文件和源文件里都有声明,
这样的设计有点像Catogary,,这种形式叫做class
extension,通常有以下几种用途:
1. 可以重声明一个数据成员,比如一个数据成员是只读的,你可以把它变成可读写,比如:
2. 增加新的数据成员
3. 实现一些不公开的方法供本类使用,可以把它放入.m的extension里面.那么这些接口都是不公开的了.
还有一种实现私有方法的方式,在@interface中没有声明,却在@implementation中实现。
注意语法,.m文件里的要加圆括号。
现在最新的xcode(应该是4.5之后), 有了一些新的特性,比如说,原来在extension里声明变量可能要这样:
然后再加上@property.现在可以直接写成:
注意没有下划线,访问时还是要加上下划线的。
另外,私有的方法也不需要再extension里先声明了,直接定义即可。
二 关于__weak
在ARC下,默认的指针都是__strong属性。这意味着一个对象赋值给另外一个指针,那么只要指针参考了该对象,该对象就会一直保持。这对于大部分对象都用,不过可能会导致retain
cycle。例如,你拥有一个对象包含了另外了一个实例变量对象,但是第二个对象又把前一个对象作为它的委托,那么这两个对象将不会被释放如果用__unsafe_unretain或__weak限定符,避免retain
cycle
三 关于变量是否用下划线
会在一些头文件里看到大括号里声明变量时,用_, 但是下面@property不用。这种编码方式比较好,建议使用。
当我们用@synthesize name=_name;时,就为属性取了一个别名需要直接引用变量就用_name,当需要用get,set方法时,就用self.name.
另外,不用下划线,容易引起内存泄露,
比如:
self.name=[[NSString alloc] initWithFormat:@"name"];
首先,声明一个字符串对象,这时候,引用计数为1.
其次,再将name的值赋给self.name。(相当于,使用了setXXX方法,让retainCount,加1),导致应用计数变成2.
所以,在类内方法访问成员变量时就直接使用带下划线的名字,尽量避免使用self.name进行赋值。这样会引起引用计数+1,容易引起释放内存泄漏。而直接用_name来赋值,
_name = [[NSString alloc] initWithFormat:@"name"];
不过在苹果的官方demo,还有斯坦福的ios课程上,都看到直接用self.xxx的写法,所以是不是一定要用这种写法还是有待商榷的,即使计数器确实多了一个,ARC应该也会帮我们管理好吧?
另外有时候在.m文件里,看不到@synthesize
这是因为XCode4.5之后,
@synthesize propertyName = _propertyName
就可以自动完成了,编译时会自动加上,不用写代码了。不过如果你全部重写了变量的setter和getter(注意是全部),那么相当于@synthesize和@property就不会生效,所以也就不存在_xxx这样的写法,直接用_xxx会报错。这种情况下我们可以在.m文件里手动写上
@synthesize propertyName = _propertyName
这样强制让_xxx变量有定义,然后我们就可以重写setter和getter了。
然后在m文件里引用property时,强制必须使用self.varName或
_varName(在getter和setter里访问),而不能直接使用varName
四 bounds和frame的区别
直接给个链接,写得浅显易懂,感谢博主:
http://blog.csdn.net/mad1989/article/details/8711697
五 performSelectorInBackground和detachNewThreadSelector有区别吗?
经过查询大量的资料,答案是没有区别,如果非要说出区别,那就是前者算是隐式调用,属于nsobject的类方法,后者算是显示调用,是nsthread的类方法.
六 关于autoLayout
xcode里有个autolayout,如下图
![](http://img.blog.csdn.net/20140415112810015?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9ueV9tYWdnaWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这个默认是选中的,如果你在代码里想调整比如按钮的位置和大小,这个按钮是在storyboard里拖进来的,通过outlet设置它的大小和位置,发现总是改变不了,就是因为这个东西是选中状态的。
七 关于@private
在头文件所有实例变量默认都是私有的, 所以方法默认都是公开的,有时候我们能看到一个在变量定义上加上@private,这样应该只是为了提高可读性,没有实质的作用.
八 @property,@synthesize与自己实现setter和getter方法的关系
对于一个变量,.h和.m里可以不管什么时候都可以加上@property,@synthesize
如果自己没重写getter和setter,编译器自已生成,反之则用我们写的。
所以并不是说,自己写了getter和setter, 就不要加@property,@synthesize了. 我觉得好的风格是保留他们,无论是否重写getter和setter. 当然对于用@property标记为readonly的变量,就可以不要@synthesize,
我们只要这现一个getter方法就可以了,没有setter方法.
九 如何查看工程中所有的约束(Constraints)
自动布局时会用到,想查看所有的约束需要在document outline查看,如下图所示:
![](http://img.blog.csdn.net/20140527153138203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9ueV9tYWdnaWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
有时document outline列表如果没有显示,可以在"editor-show document outline"打开。
http://blog.csdn.net/pony_maggie/article/details/23425901
作者:小马
该博客持续更新中,用于记录平时开发过程中遇到的问题,查到的资料汇总。仅限于一些小的知识点,不涉及大的源码工程,主要是一些编程规范,语法注意点,xcode使用等。
一 关于 class extension
下面这种用法, 头文件和源文件里都有声明,
//.h @interface classA { } @end //.m文件里也有一个 @interface classA { //其它方法或成员变量 } @end
这样的设计有点像Catogary,,这种形式叫做class
extension,通常有以下几种用途:
1. 可以重声明一个数据成员,比如一个数据成员是只读的,你可以把它变成可读写,比如:
//头文件 @interface MyClass : NSObject @property (retain, readonly) float value; @end //.m文件 @interface MyClass () @property (retain, readwrite) float value; @end
2. 增加新的数据成员
3. 实现一些不公开的方法供本类使用,可以把它放入.m的extension里面.那么这些接口都是不公开的了.
还有一种实现私有方法的方式,在@interface中没有声明,却在@implementation中实现。
注意语法,.m文件里的要加圆括号。
现在最新的xcode(应该是4.5之后), 有了一些新的特性,比如说,原来在extension里声明变量可能要这样:
@interface mainMenuViewController () { UIAlertView *_checkAlert; NSTimer *_stopTimer; NSTimer *_sendTimer; NSString *_iccATR; //保存卡片复位的ATR信息 } @end
然后再加上@property.现在可以直接写成:
@interface mainMenuViewController () @property (nonatomic, weak) UIAlertView *checkAlert; @property (nonatomic, strong) NSTimer *stopTimer; @property (nonatomic, strong) NSTimer *sendTimer; @property (nonatomic, strong) NSString *iccATR; @end
注意没有下划线,访问时还是要加上下划线的。
另外,私有的方法也不需要再extension里先声明了,直接定义即可。
二 关于__weak
在ARC下,默认的指针都是__strong属性。这意味着一个对象赋值给另外一个指针,那么只要指针参考了该对象,该对象就会一直保持。这对于大部分对象都用,不过可能会导致retain
cycle。例如,你拥有一个对象包含了另外了一个实例变量对象,但是第二个对象又把前一个对象作为它的委托,那么这两个对象将不会被释放如果用__unsafe_unretain或__weak限定符,避免retain
cycle
三 关于变量是否用下划线
会在一些头文件里看到大括号里声明变量时,用_, 但是下面@property不用。这种编码方式比较好,建议使用。
当我们用@synthesize name=_name;时,就为属性取了一个别名需要直接引用变量就用_name,当需要用get,set方法时,就用self.name.
另外,不用下划线,容易引起内存泄露,
比如:
self.name=[[NSString alloc] initWithFormat:@"name"];
首先,声明一个字符串对象,这时候,引用计数为1.
其次,再将name的值赋给self.name。(相当于,使用了setXXX方法,让retainCount,加1),导致应用计数变成2.
所以,在类内方法访问成员变量时就直接使用带下划线的名字,尽量避免使用self.name进行赋值。这样会引起引用计数+1,容易引起释放内存泄漏。而直接用_name来赋值,
_name = [[NSString alloc] initWithFormat:@"name"];
不过在苹果的官方demo,还有斯坦福的ios课程上,都看到直接用self.xxx的写法,所以是不是一定要用这种写法还是有待商榷的,即使计数器确实多了一个,ARC应该也会帮我们管理好吧?
另外有时候在.m文件里,看不到@synthesize
这是因为XCode4.5之后,
@synthesize propertyName = _propertyName
就可以自动完成了,编译时会自动加上,不用写代码了。不过如果你全部重写了变量的setter和getter(注意是全部),那么相当于@synthesize和@property就不会生效,所以也就不存在_xxx这样的写法,直接用_xxx会报错。这种情况下我们可以在.m文件里手动写上
@synthesize propertyName = _propertyName
这样强制让_xxx变量有定义,然后我们就可以重写setter和getter了。
然后在m文件里引用property时,强制必须使用self.varName或
_varName(在getter和setter里访问),而不能直接使用varName
四 bounds和frame的区别
直接给个链接,写得浅显易懂,感谢博主:
http://blog.csdn.net/mad1989/article/details/8711697
五 performSelectorInBackground和detachNewThreadSelector有区别吗?
经过查询大量的资料,答案是没有区别,如果非要说出区别,那就是前者算是隐式调用,属于nsobject的类方法,后者算是显示调用,是nsthread的类方法.
六 关于autoLayout
xcode里有个autolayout,如下图
这个默认是选中的,如果你在代码里想调整比如按钮的位置和大小,这个按钮是在storyboard里拖进来的,通过outlet设置它的大小和位置,发现总是改变不了,就是因为这个东西是选中状态的。
七 关于@private
在头文件所有实例变量默认都是私有的, 所以方法默认都是公开的,有时候我们能看到一个在变量定义上加上@private,这样应该只是为了提高可读性,没有实质的作用.
八 @property,@synthesize与自己实现setter和getter方法的关系
对于一个变量,.h和.m里可以不管什么时候都可以加上@property,@synthesize
如果自己没重写getter和setter,编译器自已生成,反之则用我们写的。
所以并不是说,自己写了getter和setter, 就不要加@property,@synthesize了. 我觉得好的风格是保留他们,无论是否重写getter和setter. 当然对于用@property标记为readonly的变量,就可以不要@synthesize,
我们只要这现一个getter方法就可以了,没有setter方法.
九 如何查看工程中所有的约束(Constraints)
自动布局时会用到,想查看所有的约束需要在document outline查看,如下图所示:
有时document outline列表如果没有显示,可以在"editor-show document outline"打开。
相关文章推荐
- 【iOS知识学习】_iOS开源项目汇总
- 【iOS知识学习】_iOS开源项目汇总
- 【iOS知识学习】_iOS面试题汇总
- 【iOS知识学习】_iOS面试题汇总(一)
- 【iOS知识学习】_iOS面试题汇总(二)
- 【iOS知识学习】_iOS开源项目汇总
- Python学习(三)——————基础知识汇总(二)
- 【iOS知识学习】_int、NSInteger、NSUInteger、NSNumber的区别和联系
- IOS 开发学习二 C语言知识 字符串处理
- 学习总结:JavaScript基础知识汇总
- 前端学习知识汇总(包括js,css,node.js,AngularJS,jq等)
- 【iOS学习笔记 16-2-22】iOS多线程知识总结
- iOS超全开源框架、项目和学习资料汇总(2)动画篇
- cs193p斯坦福视频学习总结——iOS基础知识
- 【iOS知识学习】_iOS动态改变TableView Cell高度
- 子分类账知识学习(汇总网上比较有用的资料)
- iOS 各种学习资源demo链接汇总 (包含刷新,动画,图表,对话框等效果)
- 【iOS知识学习】_iPhone学习提交git@OSC
- 转@ 标准基础知识汇总〖新手学习必读〗-机电商情网
- iOS学习资源汇总(开源项目、第三方库、技术博客等等)