公布于 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;