一、OC内存管理
我们先回忆一下C语言的内存管理,在C语言中,如果申请了两个指针同时指向同一块内存,一旦其中一个指针把这个内存释放了,那么其他指针就会变成野指针从而造成内存泄露。
在OC语言中,每个对象都有一个retainCount计数器,用来记录当前被引用的次数,被引用会+1,释放就会-1,直到为0时自动调用dealloc函数释放内存。从而避免了内存泄露的情况。
二、Object-C Category
这几天都在看OC中关于protocol和Category的内容,简单的理解protocol是在为一些类提供公用的接口,他做出了一系列的定义但他不负责具体的实现。
Category则不一样,他能为一个功能齐全的类再添加额外的接口和定义,是对已有类的补充。打个比喻就像我们玩组装高达喜欢给他们装上不同的武器去完成不同的任务,这非常有面向对象的特点。
Protocol和Category都和我们熟悉的C语言中继承有所区别,我觉得虽然C语言中继承拥有两者的特点,但个人觉得继承对父类的依赖性太大,使用继承时不仅要对父类有足够的了解,而且当父类和继承都比较庞大的时候,处理起来将会比较麻烦,这是我以前在做一些开发时得到的体会。
Category还有个功能就是让message私有化,OC中很多方法都是public的,通过Category可以实现私有化。Category能把一个类的实现分为若干不同文件中,每个Category其实都是类的一部分,要注意的是Category只能拓展消息但不能拓展字段,这和C的继承也有很大的区别
下面我引用一段代码尝试地去应用Category,这里我们为函数库里的NSSstring拓展了一个将string翻转输出的功能:
// NSString+ReverseString.h
#import <Foundation/Foundation.h>
@interface NSString (ReverseString)
-(id)reverseString;
@end
// NSString+ReverseString.m//
#import"NSString+ReverseString.h"
@implementation NSString (ReverseString)
-(id)reverseString
{
NSUInteger len=[self length]; //NSUinteger是无符号的整型,NSinteger是有符号的整型
//selg表示字符串本身
NSMutableString *retStr=[NSMutableString stringWithCapacity:len];
//NSMutableString是NSString的子类,NSString声明的字符串是不可变的,而NSMutableString声明的字符串是可变的
while(len>0)//长度大于0
{
unichar c=[self characterAtIndex:--len];
//从后取一个字符unicode
NSLog(@"c is %C",c);
NSString *s=[NSString stringWithFormat:@"%c",c];
[retStr appendString:s];
}
return retStr;
}
@end
//
// main.m
#import <Foundation/Foundation.h>
#import"NSString+ReverseString.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
NSString *string=@"Hello";
NSString *retString=[string reverseString];
NSLog(@"ret string is %@",retString);
}
return 0;
}
//输出结果:olleH