[objective-c]教程二-----objective-c 域,空对象和静态变量

改定履历:

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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值