IPHONE开发 @synthesize 变量下划线

//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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值