重点

1.NSNumber创建对象的快捷方法:
NSNumber num1=@1.5;
NSNumber num1=@18;
即:@18会将基本类型int转换成对象,也就是,@18代表NSNumber类型的对象18。
所以,创建数组也可以这样创建:
NSArray arr=[NSArray arrayWithObjects:@“11111”,@“22222”,@18,@1.5,nil];
但是,用@18这样的方法创建出来的数组是不可变的,无论你创建的数组对象是不是可变的。即:用NSMutableArray对象创建的数组也会变为不可变数组,如果你试图改变他,就会报错。


2.数组的排序:
如果数组里放的是祖父穿的话,那么可以用@selector(NSString的compare方法)。
不过,一般我们都会在数组里放我们自己定义的类,这时我们就要自己定义比较方法。


3.关于删除数组中的元素:
(1)不用快速枚举,而是用for+数组元素的下角标i进行循环判断,则要注意,每当你删除一个元素,数组的长度会-1,但是你的i还是会++,所以会出现bug,即,如果你删除了不止一个元素,则很可能你的结果里有个元素“漏下了”。解决办法就是,当删除了角标为i的元素后,重新从当前i的位置继续判断。
(2)如果你用的快速枚举,删除一个元素,必然会导致数组的长度变化,但是快速枚举不会知道,所以可能会报错。解决办法:在操作数组之前,先把数组copy到一个temp里边,在循环里对temp进行操作,如果temp中的某个元素符合删除的条件,则删除原数组里的对应元素,最后再把temp复制回原数组。


4.block中,可以用外部的局部变量,但是不能改
如:int m=100;
     int (^block)()=^(){return m;};
这样是对的,但是:
     int m=100;
     int (^block)()=^(){return m++;};
这样是错的
如果想更改外部变量,那么:
     __block int m=100;
     int (^block)()=^(){return m++;};
这样就行了
__block相当于static,由它声明的变量就不放在栈区了,而是放在全局区.


5.字面量创建的数组都是不可变的,初始化可变的不能用字面量.
比如:
NSMutableString *str=@"20140404111111";
这样创建的str就是不可变的数组


6.self就是receiver,即:-方法中代表的就是实例变量,+方法中代表这个类.


7.正则表达式,如果想直接用.,则要用两个\\.
别问我为什么…我也不知道,但是就这样


8.关于内存管理机制:
当你在一个大括号内alloc,retain,copy了一个对象,一定要在当前的大括号内release,autorelease掉这个对象.即使是for循环和if判断语句,也要这么做,而且是必须这么做.因为for和if的大括号里边定义的都是临时变量,出了大括号就被释放掉了,但是因为变量在被系统释放了以后,他所指向的空间没有release,所以不会被释放,造成内存溢出
如:
if(xxx)
{
Person *p=[[Person alloc]init];
}
p是临时变量,被放在栈区,出了if语句就会被销毁,但是初始化的person对象没有被释放,所以就内存溢出了


9.可变的类(如NSMutableString)经过copy以后,副本是不可变的.即,copy以后,返回的副本类型是NSString类型的


10.编写app要注意的3件事:
(1).进来第一件事就是要把ARC开关关掉
(2).把属性window的strong改成retain
(3).重写dealloc方法
(4).把window创建的时候加上autorelease


11.当.语法和结构体的.连写的时候,编译器区分不了你是用的是getter方法还是成员访问.左移会报错


12.UIViewController的初始化方法中一定不要用self.view.


13.MVC设计模式中,V可以做事件处理,但是不能这么做.
V只负责显示,不负责事件处理(必须要遵守,减少耦合度,使代码更独立)
例如,如果你把事件处理写在了V里边,那么你的这个V,在拿到别的地方用的时候就很局限了,别人用你的时候,只能按照你定义好的处理函数进行处理.
如果把所有的事件处理全部写在C上,让C去实现,这样,任何一个C都可以用你的V了,因为它可以按照自己的意思去处理事件.


14.类目是给类加方法,不是继承了该类,所以写方法的时候不要用super


15.新建一个类,第一件事就是要重写dealloc方法;


16.对于Target...action这种设计模式,action方法中的参数始终是当前对象.

17.UITableView内部的方法有@autorelease{}.所以不能用便利构造器,否则会crash,因为指针变成了野指针.



18.不要只图代码少,还要注意程序的可读性,宁可代码多几行,也要让看代码的人一眼就能名白代码是怎么实现的


19.如果两个不同的控件共用一个响应事件,则要把方法传进来的参数类型改成id类型,参数名改为sender.
如:-(void)addNewContact:(id)sender


20.关于Model类,有一些原则:
1.对于最近本的Model,比如person,contact,成员变量要定义为属性,而且只定义属性就好了,初始化,赋值的方法完全不需要写,因为有KVC设计模式.
2.对于组合的Model类,比如persons(人的数组),class,之类的Model类,成员变量最好不要定义为属性.如果外界需要用到这个成员变量,直接写个方法(接口)将变量返回就好了.
3.尽量将关于数据的操作全都交给Model,通常的做法是将对数据的操作封装为方法


21.创建可变数组,最好在之前先用一个不可变的数组接受数据,在根据不可变数组的count创建可变数组的大小,这样可以节省许多不必要的动作,优化内存.Capacity后面跟的是元素的个数,而不是字节大小,这点要注意;
创建可变数组的时候,每多家一个元素,如果下边的空间不够了,则系统会给数组重新分配空间.试想,最糟糕的情况是你添加了n个元素,换了n个地方,这样就增加了很大的工作量,影响了程序的性能.
高手的做法:
在初始化可变数组之前,计算出要接受的数据中元素的个数,具体做法是先用一个不可变的接受数据,再用不可变数组(字典)的count值来初始化可变数组(如果需要创建一个不可变数组的话).这样就避免了一些问题.

22.第一次执行控制器的View属性的getter方法的时候,会调用loadView方法,这个方法执行完毕以后,会立即执行ViewDidLoad.而且一般情况下,这两个方法只执行一次.
当控制器.View被添加到别的控件上得时候,会执行ViewWillAppear,然后执行ViewDidAppear
viewDidUnload什么时候执行?当把self.View设置为nil的时候会执行
当控制器.view从父视图移除(removeFromSuperview)的时候,会执行viewWillDisappear,viewDidDisappear


23.尽量多定义方法,让代码可读性提高.if语句里最好值执行一个方法,而不是大量的多步骤的操作.

24.模态切换是UIViewController的一个实例方法,任何UIViewController及其子类都可以调用这个方法.
这个方法将会给我们呈现一个(临时)界面,用来处理一些临时信息.你所需要做的就是创建一个要显示的界面的试图控制器.



25.GET请求方式的
缺点:1.不安全,2.有255个字节的长度限制
优点:

26.系统会给主线程分配1M的栈空间.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值