您的位置:首页 > 移动开发 > IOS开发

IOS学习之知识大汇总

2014-04-11 10:15 351 查看
转载请注明出处
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"打开。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: