OC 成员变量下划线_解析

*.h中申明变量

 

#import <UIKit/UIKit.h>

@interface NewPlayerController : UIViewController{

NSString* _test;

    

}

@property(nonatomic,retainNSString *test;


@end


在*.m中


 


#import "NewPlayerController.h"

@implementation NewPlayerController

 

@synthesize test=_test;


- (void)viewDidLoad

{

    [super viewDidLoad];

 

    _test=[[NSString allocinitWithFormat:@"test"];

 

   // 或者这样

    self.test=[[NSString alloc] initWithFormat:@"test"];

 

     

}


@end

首先,_下划线是一种编程规范,apple的代码开始没有这么做,最近两年才这样了,用于修饰成员变量,
@synthesize name=_name; 目的就是生成的getter和setter中所引用的是_name 而不是name。name从此就不应该在代码中出现,该出现的要么是_name,要么self.name.

self.name 就是[self getName]

_xxx访问的是xxx的地址。
self.xxx访问的是xxx的getter。
这两者并不是完全等价的,self.xxx是用objc_msgSend发消息,_xxx或者self->xxx则是直接访问内存地址,
一般建议在init里面用_xxx,其他地方用self.xxx


方式一:(为何要定义一个_test?下划线开头代表什么意思?在实现的时候怎么又将_test付给了test?)
请输入图片描述
方式二:(方式2跟方式1到底有何区别?)
请输入图片描述
方式三:(这种最简单了,但是这样写规范吗?)
请输入图片描述

第一种是比较老式的写法,不过 NSString *_test; 这个就是多余的了,这个是更老式的了,那时候要手写 getter setter
因为有了 synthesize 自动属性合成器以后,这步,Xcode已经帮你做过了。
还帮你写了默认的 getter setter 方法,有下划线就是标识,这个是成元变量,以便于区分 getter setter 中的形参(局部变量)。

在 m 文件中是可以直接对 带下划线的 成员变量进行赋值等操作的,但规范还是建议 使用 self.test 这样来操作,除非你正在 setter getter 方法中,那是不能用这个。

还有谷歌那个 objc 代码风格,, 哈哈成员变量 下划线在后面, test_ ,又晕了吧?我估计这个风格是为了完全区分 纯成员变量,和 属性。就是说 后面带下划线的这货,就纯粹是类本身自己用,没有 getter setter,不需要给别的类访问。

最后,早在 Xcode 4.6 起,还是更早来着,记不得了, 什么 synthesize 根本不用写的,Xcode 已经帮你写了 @synthesize test = _test。

所以现在最简洁的思路就是,如果你这个变量,是要给其他类能够访问到的,那么你就直接写个 @property 就够了。

声明成员变量 NSString *_test; 还有属性合成器 @synthesize test = _test,不需要写了,

如果你这个变量,完全不需要给类外部访问,那么你就 自己声明个 成员变量 NSString *test_; 其他别写。该初始化的地方初始化该释放的释放

//----------------

发现被踩了下,纯个人理解可能会有误,如有误望不吝请指出,多谢,

前面最后说的有些不严谨了~ 没说 在 h 和 m 中的区别。
在 h 中,只有 成员变量的话虽然没有 getter setter , 子类还是能访问的。属性的话就是相当于公开的。

在 m 中,都是私有了。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值