OC坑集: ARC 下覆写 setter/getter

如果你看过博客 OC坑集: 实例变量不需要 @synthesize, 接下来的内容对你来说就是小菜一碟.

在非 ARC 时代, 就是人们常说的 MRC(手动管理内存)时代, 我们需要 retain/release/autorelease 等.

cocos2d-x 也借鉴了 oc 的 retain 等操作来管理内存.

这里真心要吐槽一下, c++ 新标准为毛越来越像 java.

好了, 不扯淡了, 说正事.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在说 ARC 下覆写 setter/getter 之前, 先看一下 MRC下如何覆写 setter/getter.

#import 

@interface Cat : NSObject

@property (copy, nonatomic) NSString *name;

- (void)echo;

@end

实现文件

#import "Cat.h"

@implementation Cat

@synthesize name = _name;

@synthesize dog = _dog;

- (void)setDog:(Dog *)dog
{
    if (_dog != dog) {
        [_dog release];
        _dog = nil;
        _dog = [dog retain];
    }
}

- (Dog *)dog
{
    return _dog;
}

- (void)setName:(NSString *)name
{
    //TODO
}

- (NSString *)name
{
    return _name;
}

- (void)echo
{
    _name = @"XiaoHua";
    NSLog(@"name = %@", _name);
}

@end

在 ARC 下, 不允许出现 retain/release/autorelease 等关键字. 头文件重新声明如下, 其中 retain 被 strong 取代.

#import 
#import "Dog.h"

@interface Cat : NSObject

@property (strong, nonatomic) Dog *dog;

@property (copy, nonatomic) NSString *name;

- (void)echo;

@end

实现文件

#import "Cat.h"

@implementation Cat

@synthesize name = _name;

@synthesize dog = _dog;

- (void)setDog:(Dog *)dog
{
    if (_dog != dog) {
        _dog = dog;
    }
}

- (Dog *)dog
{
    return _dog;
}

- (void)setName:(NSString *)name
{
    //TODO
}

- (NSString *)name
{
    return _name;
}

- (void)echo
{
    _name = @"XiaoHua";
    NSLog(@"name = %@", _name);
}

@end

实例变量 _name是 copy 属性, 这里也展示一下其 setter 方法

- (void)setName:(NSString *)name
{
    if(_name != name) {
        _name = nil;
        _name = [name copy];
    }
}

提醒大家一点:

在覆写的 setter 和 getter 方法里面不要使用点语法访问自己的实例变量(会造成循环调用, crash), 直接访问实例变量即可.


更多关于 ARC 的问题, 请关注后续博客.


你可能感兴趣的:(objective-c,ARC,MRC,iOS)