博客搬家,写于 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没有问题,但是同时重写就会报错了。
/* *************** 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;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。