您的位置:首页 > 其它

IPHONE开发 @synthesize 变量下划线

2013-11-19 11:10 337 查看
//AppDelegate.h
@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong) NSMutableArray *myArray;

@end


//AppDelegate.m
@implementation AppDelegate

@synthesize window = _window;
@synthesize myArray = _myArray;

@synthesize的作用是为属性window和myArray生成存取方法,即setWindow/getWindow和setMyArray/getMyArray
该属性存取方法中进行下划线赋值(window = _window)是何意?

作用:防止类的成员变量_window和_window设置方法setWindow的函数参数产生冲突,比如重写该set方法时:

@synthesize window ; //如果不写 = _window

-(void) setwindow:(UIWindow)window // OC 会自动填充完成setter语句
{
window = window //??造成混乱,方法里面用的究竟是参数的ivar还是类里面的ivar
}则会产生编译错误: Synthesized property 'xX' must either be named the same as a compatible ivar or must explicitly name an ivar

正确的方法是:

方法一:把参数的ivar名字改成和类里面的ivar不同的名字

@synthesize window;

-(void) setWindow:(UIWindow *)myWindow// 改成不一样的名字
{
window = mywindow //类变量赋值为参数变量
}

方法二:@synthesize happiness = _happiness 
@synthesize window = _window

-(void) setWindow:(UIWindow *)window// 不冲突了
{
_window = window; //类变量名赋值为参数变量值
}

为什么有些变量属性定义的时候,不需要加下划线?比如:
//ViewController.h
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;

//ViewController.m
@implementation ViewController
@synthesize scrollView;
@synthesize pageControl;
定义的控件属性不会有变量给其赋值,因此不需要有下划线

【参考】

1. http://www.cocoachina.com/bbs/read.php?tid=98617

2. http://moto0421.iteye.com/blog/1577459

3. http://blog.csdn.net/qq515383106/article/details/8508611
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息