06-OC特有语法01

点语法

  • set方法和get方法的调用
OC中的set方法和get方法都是对成员变量的修改和操作。在方法调用上set方法和get方法都使用中括号来调用,如果仅仅是修改成员变量的值可以直接使用OC的点语法的功能来简化set方法和get方法的调用进而简化重复代码书写。

Person.h

@interface Person : NSObject  
{  
         int _age;  
         NSString *_name;  
}  
  
- (void)setAge:(int)age;  
- (int)age;  
  
- (void)setName:(NSString *)name;  
- (NSString *)name;  
@end  

Person.m

@implementation Person  
  
- (void)setAge:(int)age  
{  
        _age = age;  
}  
  
- (int)age  
{  
        return _age;  
}  
  
- (void)setName:(NSString *)name;  
{  
        _name = name;  
}  
  
- (NSString *)name  
{  
        return _name;  
}  
@end  

main.m

int main()  
{  
        Person *p = [Person new];  
          
        p.age = 10;  
        NSLog("age = %d",p.age);  
  
        p.name = @"seed";  
        NSLog("name = %@",p.name);  
  
        return 0;  
}  

运行结果:

2017-11-26 22:52:28.021589+0800 04-点语法[29003:2221261] age =10
2017-11-26 22:52:28.021930+0800 04-点语法[29003:2221261] name = seed
Program ended with exit code: 0

成员变量的作用域

@public : 在任何地方都能直接访问对象的成员变量
@private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private)
@protected: 可以在当前类及其子类的对象方法中直接访问(@interface中默认就是@protected)
@package : 只要处在同一个框架中,就能直接访问对象的成员变量
@interface和@implementation中不能声明同名的成员变量。  
#import <Foundation/Foundation.h>  
@interface Person : NSObject  
{  
   int _no;  
     
   @public // 在任何地方都能直接访问对象的成员变量  
   int _age;  
     
     
   @private  // 只能在当前类的对象方法中直接访问  
    int _height;  
     
   @protected // 能在当前类和子类的对象方法中直接访问  
   int _weight;  
   int _money;  
}  
   
- (void)setHeight:(int)height;  
- (int)height;  
   
- (void)test;  
@end  

property声明简化

@property:自动声明操作成员变量的set方法和get方法。property同时也自动生成方法的实现,使得set方法和get方法的书写量大为减少。
> 用在@interface中
> 用来自动生成setter和getter的声明
> @property int age;  可以替代下面的两行
- (void)setAge:(int)age;
- (int)age;

Student.h

@interface Student : NSObject  
  
@property int age;  
@property int score;  
  
- (void)test;  
@end  

Student.m

@implementation Student  
  
- (void)test  
{  
    _age = 20;  
    _score = 90;  
}  
@end  

main.m

int main()  
{  
    Student *s = [Student new];  
      
    s.age = 10;  
    NSLog(@"age = %d",s.age);  
      
    s.score = 100;  
    NSLog(@"score = %d",s.score);  
     
    [s test];  
    NSLog(@"age = %d",s.age);  
    NSLog(@"score = %d",s.score);  
      
    return 0;  
}  

运行结果:

2014-06-04 22:36:09.619 ff[571:303] age = 10  
2014-06-04 22:36:09.622 ff[571:303] score = 100  
2014-06-04 22:36:09.623 ff[571:303] age = 20  
2014-06-04 22:36:09.624 ff[571:303] score = 90  
Program ended with exit code: 0  

自动生成的成员变量是私有的,不能直接被外部访问只能在类的内部访问。

property新特性

> 自从xcode4.4后,@property独揽@synthesize的功能,即@property也可以自动生成方法的实现
> 默认情况下,setter和getter方法中的实现,会去访问下划线_开头的成员变量
> 若已有setter或getter方法的实现,不会自动生成setter或getter

synthesize的实现

synthesize与property相对,property自动声明方法,synthesize自动完成方法的对应实现。一般synthesize可以省略不写,也可以写明成员变量的赋值保护成员变量不被非法访问。
> 用在@implementation中
> 用来自动生成setter和getter的实现
> @synthesize age = _age;
* setter和getter实现中会访问成员变量_age
* 如果成员变量_age不存在,就会自动生成一个@private的成员变量_age
> @synthesize age;
* setter和getter实现中会访问成员变量age
* 如果成员变量age不存在,就会自动生成一个@private的成员变量age
> 手动实现
* 若手动实现了setter方法,编译器就只会自动生成getter方法
* 若手动实现了getter方法,编译器就只会自动生成setter方法
* 若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量

Good.h

@interface Good : NSObject  
{  
  int _count;  
  NSString *_na;  
}  

@property int count;  
@property NSString *name;  

@end  

Good.m

@implementation Good  
  
@synthesize count = _cou;  
@synthesize name = _na;  
  
@end  

main.m

int main()  
{  
    Good *g = [Good new];  
      
    g.count = 10;  
    NSLog(@"count = %d",g.count);  
      
    g.name = @"buster";  
    NSLog(@"name = %@",g.name);  
      
    return 0;  
}  
synthesize可以指定成员变量间的赋值,这样可以保护成员变量被非法访问。

id

1.简介
  • 万能指针,能指向任何OC对象,相当于NSObject*
  • id类型的定义
typedef struct objc_object{
  Class isa;
}*id;
2.使用

//注意:id后面不要加上*
id p = [Person new];

3.局限性

调用一个不存在的方法,编译器会马上报错

构造方法

1.对象创建原理
Person *p = [[Person alloc] init];
2.init方法的重写
  • 想在对象创建完毕后,成员变量马上就有一些默认的值
  • init方法的重写过程
- (id)init
{

    if (self = [super init])
    {
        //初始化成功
        _age = 10 ;
    }

    //返回一个已经初始化完毕的对象
    return self;
}
init.png
3.自定义构造方法
  • 自定义构造方法的规范
    • 一定是对象方法,一定以- 开头
    • 返回值一般是id类型
    • 方法名一般以init开头
//  Person.h
//  自定义构造方法
//
#import <Foundation/Foundation.h>

@interface Person : NSObject

@property NSString *name;
@property int age;

- (id)initWithName:(NSString *)name;
- (id)initWithAge:(int)age;

- (id)initWithName:(NSString *)name andAge:(int)age;
@end

参考:黑马程序员_OC的特有语法
iOS笔记之_OC特有语法

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

推荐阅读更多精彩内容