iOS语法小结---豁然开朗

———————@synthesize,@dynamic——————–
1. @property是对setter和getter方法的声明,编译器遇到@property后会自动
展开为setter和getter方法。
2. 在当下的开发环境中,@property也会对setter和getter方法进行实现
3. 例:
.h文件中声明了 @property(nonatomic,copy)NSString *tempString;
.m文件中系统自动帮你实现
-(NSString *)tempString {
return _tempString;
}
-(void)setTempString:(NSString *)tempString {
_tempString = tempString;
}
注意:在这里系统会去寻找是否你的成员变量有 _tempString,如果没有找到,会帮你生成_tempString
4.如果你在.m文件中@synthesize tempString; 那么系统会去寻找是否你的成员变量有 tempString,如果没有找到,会帮你生成tempString;
5.如果你在.m文件中@synthesize _tempString; 那么系统会去寻找是否你的成员变量有 _tempString,如果没有找到,会帮你生成_tempString;
//编译器很傻的,你想让它生成什么就帮你生产什么。。。
6.如果你在你的.m文件中实现了某个属性的setter或getter方法,则系统就不会再次实现你所实现的方法。
7.@dynamic告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成。(当然对于readonly的属性只需提供getter即可)。假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var =someVar,由于缺setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。
———————————–内存管理MRC————————————
1.黄金法则:谁创建谁释放,谁污染谁治理
4. .h文件中 @property(nonatomic,strong)NSArray *tempArray;
.m文件的setter方法为
-(void)setTempArray:(NSArray *)tempArray {
if (_tempArray != tempArray) {
[_tempArray release];
_tempArray = [tempArray retain];
}
}
3.在类的-(void)dealloc {}方法中把本类中关联的其他类的实例变量release一次,以免造成内存泄露.
5. 对于autoReleasePoll,在程序运行过程中会不断的生成自动释放池,当一个对象调用autoRelease后系统会将这个对象放在最近的一个自动释放池中,当池子销毁时,会对池子里的所有对象发送一条release消息,但这并不意味着池子里的对象会全部销毁,只不过是引用计数减一而已。(放在栈顶的自动释放池会最先被销毁,先进先出)。
———————————–内存管理ARC————————————
1.ARC(Automatic Reference Counting),中文名称:自动引用计数
2.ARC是编译器(时)特性,而不是运行时特性,更不是垃圾回收器(GC)。
3.ARC的修饰符
A. __strong
表示引用为强引用。对应在定义property时的”strong”。所有对象只有当没有任何一个强引用指向时,才会被释放。
注意:如果在声明引用时不加修饰符,那么引用将默认是强引用。当需要释放强引用指向的对象时,需要将强引用置nil。
B. __weak
表示引用为弱引用。对应在定义property时用的”weak”。弱引用不会影响对象的释放,即只要对象没有任何强引用指向,即使有100个弱引用对象指向也没用,该对象依然会被释放。不过好在,对象在被释放的同时,指向它的弱引用会自动被置nil,这个技术叫zeroing weak pointer。这样有效得防止无效指针、野指针的产生。__weak一般用在delegate关系中防止循环引用或者用来修饰指向由Interface Builder编辑与生成的UI控件。
. ———————————-copy—————————————-
1.copy的本质是对用copy产生的新对象的操作不会对原来的对象有任何影响。
2.深拷贝:内容复制
浅拷贝:指针复制(引用计数会加1
3.@property(nonatomic,copy)NSString *tempString;
copy 代表set方法会release旧对象,copy新对象
修改外部的变量,并不会改变内部的变量
-(void)setTempString:(NSString *)tempString {
if (_tempString != tempString) {
[_tempString release];
_tempString = [tempString copy];
}
}

你可能感兴趣的:(IOS学习)