改定履历:
2012-05-07-------------新建文本文档
正文:
本文原文地址
Objective-C内存管理(概览)
objective-c使用引用计数来跟踪一个对象是否应被释放(free).在运行时执行真实的内存释放(free).
1. 使用"retain"增加引用计数.
[value retain]
2. 使用"release"来减少引用计数
[value release]
一旦计数为0,运行时做为垃圾回收该对象内存.
3. "autorelease"也减少对象的引用计数
※ 但即使计数值为0,除非整个方法调用链完成,对象不会被做为垃圾回收.
[value autorelease]
"setter"方法的内存管理
使用"setter"方法管理引用计数
- (void) setValue: (NSString*)input
{
[value autorelease];
value = [input retain];
}
1. 减少原值"value"的引用计数.
2. 增加新值的引用计数
3. 使用"autorelease"代替"release".
※ 如果我们用同一个旧对象设置变量value的值,在对象"input"的引用计数值再增加之前,第一个"release"可能会释放(release)其引用计数值,
objective-c静态和全局变量
创建一个相同类实例间的共享变量:
static MyString* MySingletonInstance;
@implementation MyString
+ (MyString *) instance
if ( MySingletonInstance == nil ) {
MySingletonInstance = [[self alloc] init];
}
return MySingletonInstance;
}
1. 返回该静态变量:
MyString *v = [MyString instance];
2. 类常量:
int MyConstant;
@implementation MyString
...
3. 初始化静态或全局变量:
+ (void)initialize
{
// Avoid multiple initialize called by its children
if (self == [MyString class]) {
...
}
}
空对象(Nil Object)
obj1 = nil;
result = [obj1 somemethod];
1. 给Nil对象发送消息将返回一个Nil对象.
2. objective-c提供一个每次都不验证Nil对象的机制.
实现dealloc方法可选择的方式如下(Alternative way in implement dealloc):
- (void) dealloc
{
self.value = nil;
[super dealloc];
}
self.value = nil;
调用会自动释放(release)旧的对象并且设置该变量为nil的方法是实现dealloc比较好的方式(A preferable way to implement dealloc).
实例变量的域
控制objective-c实例变量的域(scope):
@interface MyString : NSObject
{
char *name;
@private
// Accessible by this class only
char* privateData;
@protected
// Also accessible by children class
float protectedData;
@public
// Accessible by everyone
id publicData;
}
※ 缺省是@protected.
对象关联
关联两个objective-c对象:static char key;
NSString *v1 = [[NSString alloc] init];
NSString *v2 = [[NSString alloc] init];
objc_setAssociatedObject (
v1,
&key,
v2,
OBJC_ASSOCIATION_RETAIN
);
返回关联的对象:
NSString *associate = (NSString *)objc_getAssociatedObject(v1, &key);
切断关联:
objc_setAssociatedObject(v1, &key, nil, OBJC_ASSOCIATION_ASSIGN);