OC坑集: ARC 下覆写 setter/getter

来源:互联网 发布:网络机顶盒哪个最好 编辑:程序博客网 时间:2024/06/06 23:35

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

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

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

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

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

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

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

#import <Foundation/Foundation.h>@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 <Foundation/Foundation.h>#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 的问题, 请关注后续博客.


0 0