OC学习之进阶
1.内存管理
概念,当alloc出一个对象,其构成为 对象自身+retainCount ,这个retainCount是对象计数器 。判断对象要不要回收的唯一依据(存在一种例外:对象值为nil时,引用计数为0,但不回收 空间)就是计数器是否为0,若不为0则存在。对象被销毁前会给系统发送dealloc,当然可以重写此函数。dealloc不能直接调用,如果意见被回收过的对象再次使用会报野指针(Zombie)。在diagnostics中可以开启Zombie监测。
Objective-C供了三种内存管理方式:MannulReference Counting(MRC,手动管理,在开发 iOS4.1之前的版本的项目时我们要 自己负责使用引用计数来管理内存,比如要手动 retain、release、autorelease 等,而在其后 的版本可以使用 ARC,让系统自己管理内存。) automatic reference counting(ARC,自动引用计数,iOS4.1 之后推出的) garbage collection(垃圾回收)。iOS不支持垃圾回收; ARC作为苹果新供的技术,苹果推荐开发者使用ARC技术来管理内存;
想要手动调用retain,release必须关闭ARC . 在build setting中可以设置。
官方强烈建议不需要手动托管资源计数与释放,那便略过。ARC不是垃圾回收,是编译器特性不是运行时特性。ARC判定是否回收的规则,至少有一个强指针指向对象就不会执行回收。
2.Category 和 C#exten class差不多,都是在不更改当前类的前提下,新增类扩展当前类的api 。
3.神奇的block,apple推荐使用的数据类型。使用场景广泛,用来保存一段代码恰当的时机调用。
4.@protocol 协议,这东西与C#的abstract保持一致,其实没什么好说的。其中有两个关键字 @required 必须实现此方法; @optional 可以选择不实现;众所周知接口可以多继承oc也不例外。
5.代码 暂时就那么多吧,后面再接着写
#import <Foundation/Foundation.h>
//声明一个协议也就是c#中的接口
@protocol IprototolTest
@required -(void)ShowTxt :(NSString*) str;
@optional -(void)ShowTxtNoParams;
@end
@interface TestClass:NSObject <IprototolTest>
{
@public
int name;
}
-(void) PrintName:(NSString*) name;
@end
@implementation TestClass
-(void)PrintName:(NSString *)name
{
NSLog(name);
}
-(void)ShowTxt:(NSString *)str
{
NSLog(str);
}
@end
@interface TestClass (testCategory)
-(void)SayHello;
@end
@implementation TestClass(testCategory)
-(void)SayHello
{
NSLog(@"helloworld");
}
@end
void (^testBlockMethod)(int, NSString*) = ^ (int x, NSString* y)
{
NSLog(@"%d +++++ %@", x , y);
};
int main(int argc, const char * argv[]) {
@autoreleasepool {
TestClass *s = [[TestClass alloc] init];
[s SayHello];
testBlockMethod(1001,@"testBlock ...");
}
return 0;
}