如果你看过博客 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 的问题, 请关注后续博客.