乐趣区

关于objective-c:synthesize

公布于 2018/08/28 18:10,搬家到思否。

Xcode4 时,@property 只能生成 getter、setter 办法的申明;

从 Xcode5 开始,@property 能够主动生成_propertyName 成员变量和 getter、setter 办法的申明和实现。默认状况下,getter、setter 办法作用于_propertyName 变量。

然而,当同时重写 getter 和 setter 两个办法的时候,实现了齐全的自定义实现,无奈对应到默认的变量_propertyName,_propertyName 就有效了,须要手动定义一个变量或者应用 @synthesize 指定一个变量来绑定到属性上。

一、手动定义变量

Girl.h

#import <Foundation/Foundation.h>
@interface Girl : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *boyFriend;
@end

Girl.m

#import "Girl.h"

@implementation Girl
/* *************** MARK: 办法一 *************** */
{NSString* _name; // 手动注册变量}
- (NSString *)name{if (!_name) {_name = @"zhangli";}
    return _name;
}
- (void)setName:(NSString *)name{_name = name;}

@end

如果不去手动定义一个变量,那么独自写 getter 或 setter 没有问题,然而同时重写就会报错了。

二、@synthesize

/* *************** MARK: 办法二 *************** */
@synthesize boyFriend = man; // 应用 @synthesize, 将属性对应于变量
- (NSString *)boyFriend {if (!man) {man = @"Jerod";}
    return man;
}
- (void)setBoyFriend:(NSString *)boyFriend{man = boyFriend;}

属性 boyFriend 本来是对应于_boyFriend 变量的,这里通过 @synthesize 扭转了属性、getter、setter 对应的变量。(这点很有用途,比方能够在子类批改父类中 readonly 属性的值。)

当然,如果不须要自定义实现 setter、getter,那么只须要写一个 @synthesize property = newName;

退出移动版