iOS知识点整理-成员变量,实例变量和关键词

上一篇:关于runtime的知识点整理

二. 关于成员变量,实例变量,@public,@private,@protected,@package,@property,@synthesize,@dynamic

成员变量:代码中的变量,包含实例变量和基础数据类型,无需与外界接触;

实例变量:由类定义的实例化的变量(不包含基础数据类型,如intdoublefloat);

@public:在任何地方都能直接访问对象的成员变量;

@private:只能在当前类及其子类的对象方法中直接访问,如果子类要访问需要调用父类的settergetter方法;

@protected:可以在当前类的对象方法中直接访问(系统默认下是用它来修饰的);

@package:在同一个包下就可以直接访问,比如说在同一个框架下;

@property:
a. 是声明属性的语法,可以快速方便的为成员变量创建存取器,允许我们通过点语法使用存取器(存取器:指用于获取和设置成员变量的方法。用于获取成员变量值的存取器是getter,用于设置实例变量的存取器是setter),可与外界接触;
b. 使用@property就不必单独声明成员变量了,因为在没有显式提供成员变量声明的前提下,系统会自动帮你生成成员变量;
c. 当我们同时重写了setter和getter方法时,系统会报错,其解决办法:在.m文件中使用@synthesize(原因:同时重写时。系统就不会自动生成setter和getter方法,成员变量也不就不会生成了,默认的@synthesize var=_var就会失效,所以会报Use of undeclared identifier '_var'的错误)。

@synthesize:
a. @synthesize是为属性添加一个成员变量名,或者说别名。同时会为该属性生成 setter/getter方法。
b. 如果某属性已经在某处实现了自己的 setter/getter ,可以使用 @dynamic来阻止 @synthesize自动生成新的setter/getter 覆盖。
c. 当在protocol中声明并实现属性时。协议中声明的属性不会自动生成setter和getter,需要使用@synthesize生成setter和getter[UIApplicationDelegate window]就是个典型的例子。
d. @property有两个对应的词,一个是 @synthesize,一个是 @dynamic。如果 @synthesize和 @dynamic都没写,那么默认的就是@syntheszie var = _var;

@dynmic:@dynamic告诉编译器:属性的 setter 与 getter方法由用户自己实现,不自动生成。(当然对于 readonly的属性只需提供getter即可)。假如一个属性被声明为 @dynamic var,然后你没有提供 @setter方法和 @getter 方法。编译的时候没问题,但是当程序运行到 instance.var = someVar,由于缺 setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺 getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。

代码示例:

#import <UIKit/UIKit.h>

typedef NS_ENUM(NSUInteger, SEX) {
    GIRL,
    BOY
};
@interface ViewController : UIViewController
{
@public NSString *name;
@private int age;
@protected SEX sex;
@package NSString *grade;
}
@end

子类中被@private修饰的age不能被访问

屏幕快照 2019-05-15 下午3.23.22.png

其他类中被@private修饰的age和@protected修饰的sex不能被访问

屏幕快照 2019-05-15 下午3.30.13.png

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic,copy) NSString *test;//系统会自动生成setter,getter方法
@end
@implementation ViewController
//在使用@property时同时重写setter和getter方法报错,解决办法使用@synthesize指定成员变量:
@synthesize test;//表明生成的成员变量是test。

- (void)viewDidLoad {
    [super viewDidLoad];
}

-(void)setTest:(NSString *)test {
    test = test;
}

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