OC 中定义属性(成员变量)及相关修饰符、关键字

一、成员变量(属性),局部变量,全局变量

1.成员变量

概念: 写在类声明@interface...{}的大括号中的变量, 称之为成员变量(属性, 实例变量)

使用方式: 成员变量只能通过对象来访问

定义与初始化: 成员变量不能在定义的同时进行初始化, 注意:成员变量不能离开类, 离开类之后就不是成员变量

存储与释放: 存储在堆(当前对象对应的堆的存储空间中), 存储在堆中的数据, 不会被自动释放, 只能程序员手动释放

而在这个地方,其实也要区分一下成员变量和属性

成员变量就是我们在开发中,类似下面这样定义的变量,例如:

@interface Person : NSObject
{
    @public
    NSString *_name;
    CGFloat _age;
}
@end

这里又要解释一下概念

指令 ----- 意思
@private --- 作用范围只能在自身类
@protected --- 作用范围在自身类和继承自己的子类,什么都不写,默认是此属性。
@public --- 作用范围最大,在任何地方
@package ---只要处在同一个框架中,就能直接访问对象的成员变量

则_name,_age便是成员变量。

属性就是在开发中,我们用 @property 关键字声明的变量,如:

@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) CGFloat *age;

该方法做了三件事情
①自动生成_name和_age成员变量,
②自动生成相应的getter方法
③自动生成相应的setter方法

因此两者最直观的区别是属性会有相应的getter方法和setter方法,而成员变量没有,另外,外部访问属性可以用"."来访问,访问成员变量需要用"->"来访问

而成员变量想自动生成相应的getter/setter方法,可以用@synthesize修饰解决

synthesize定义方法 -> m文件中实现getter和setter方法。
@interface 类名 (){
    @public
    CGFloat _age;
}  
@end

@implementation 类名
@synthesize age = _age;
@synthesize age ;  (或者这样写)

当然,自从xcode4.4之后,@property方法生成的getter方法和setter方法可能满足不了您的需求,您也可以自己手动添加getter方法和setter方法,如果手动写了setter方法@property就不会生成setter方法,但还是会生成getter方法,getter同理,如果您将setter方法,getter方法都进行手动书写了,@property将不会为您生成相应的getter方法和setter方法。

2.局部变量

概念: 写在函数或者代码块中的变量, 称之为局部变量

作用域: 从定义的那一行开始, 一直到遇到大括号或者return

定义与初始化: 局部变量可以先定义再初始化, 也可以定义的同时初始化

存储与释放: 存储在栈, 存储在栈中的数据有一个特点, 系统会自动释放

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSString *partner = @"";
    UIImage *img = [UIImage imageNamed:@""];
    UIButton *btn = [UIButton new];
    NSArray *arr = [NSArray array];
}
//这些变量只在该方法中存在, 在 } 之后会自动释放

3.全局变量

概念: 写在函数和大括号外部的变量, 称之为全局变量

作用域: 从定义的那一行开始, 一直到文件末尾

定义与初始化: 全局变量可以先定义再初始化, 也可以定义的同时初始化

存储与释放: 存储在静态区, 程序一启动就会分配存储空间, 直到程序结束才会释放

@implementation 类名
static NSString *const cellID = @"lookDoctorCell";

二.定义属性括号中关键字

readonly: 只读特性, 只会生成getter方法, 只可被外界读取, 不能修改
readwrite: 可读可写特性, 需要生成setter和getter方法时使用, 可被外界读取和修改.


atomic: 会给属性加上一个同步锁, 这是为了防止多线程同时访问属性出现异常需要添加的属性, 但是这样会增加额外的内存开销 并且在变编程习惯中, 我们都应该避免多线程访问统一资源. 即便是使用atomic, 在多线程时也无法完全保证线程安全, 往往是需要手动添加线程锁
nonatomic: 非原子性, 即非线程安全的, 不给变量提供线程锁保护, 这样会提高性能(推荐使用)


assign:适用于基本数据类型
assign:对象不能使用 assign,但原始类型(BOOL、int、float)仍然可以使用
weak:是适用于NSObject对象,并且是一个弱引用。
weak当对象销毁的时候,指针会被自动设置为nil,而assign不会* assigin 可以用非OC对象,而weak必须用于OC对象


copy: 对于字符串和block的属性一般使用copy
和之前MRC的 copy 一样,复制一个对象并创建 strong 关联
strong: 等同于MRC的"retain",属性成为对象的拥有者


说一下@property 括号里面没有这个关键字
对应基本数据类型默认关键字是
property的属性默认是:readwrite,assign, atomic
在ARC内存管理模式下,对于普通的OC对象
property的属性默认是:readwrite,strong, atomic

@property (nonatomic)    int             isIndex;  
@property (nonatomic)    BOOL       isNotDex;
@property (nonatomic)    NSString  * str;
//等同于
@property (nonatomic, readwrite , assign)    int             isIndex;  
@property (nonatomic, readwrite , assign)    BOOL       isNotDex;
@property (nonatomic, readwrite , strong)    NSString  * str;

下面列举常用属性定义

@property (nonatomic , assign) int  isIndex;  
@property (nonatomic , assign) BOOL    isOK;
@property (nonatomic , assign) float   keyNum;
@property (nonatomic, strong) NSIndexPath * selectedIndex;
@property (nonatomic , strong) UITableView * cityView;
@property (nonatomic, strong) NSArray * countryArray;
@property (nonatomic, strong) NSDictionary * allData;
@property (nonatomic ,weak)IBOutlet UITableView * TableView;  ///xib
@property (nonatomic ,weak) IBOutlet NSLayoutConstraint *bottomViewHeightConstraint;///xib
关于block 属性
首先,定义block
typedef void (^BLWebViewProgressBlock)(float progress);
然后,定义类的block属性
@property (nonatomic, copy) BLWebViewProgressBlock progressBlock;

我是楚简约,感谢您的阅读,

喜欢就点个赞呗,“❤喜欢”,

鼓励又不花钱,你在看,我就继续写~

非简书用户,可以点右上角的三个“...”,然后"在Safari中打开”,就可以点赞咯~


到此为止.记录下容易忘的细节同大家分享!!!🙂🙂🙂

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容