黑马程序员--OC-点语法


               ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


不管是在Java中还是在C#中这些面向对象的语法,我们经常使用对象.成员变量的方式,来很方便的操作。



也许是为了让更多地习惯这种操作的程序员们,OC中也引入了点语法。

@property有以下几种属性

readwrite 默认

assign 默认

readonly 只读(只有get方法,禁用set方法) 

给setter和getter方法起别名(setter = a:, getter = b)

atomic  开启多线程变量保护,会消耗一定的资源(非原子性,保证多线程安全)

nonatomic:禁止多线程变量保护,提高性能 

assign:直接赋值,适用于基本数据类型(非对象类型)

retain:赋值时做内存优化,使用于对象类型

copy:复制一个副本,适用于特殊的对象类型(常用于NSstring)(有NSCoping协议的才可以用copy)



1.先来看一下刚刚学习时,我们经常见到的代码:

类的声明:

#import <Foundation/Foundation.h>

@interface Cat: NSObject {    

 int age;

 }
- (void)setAge:(int)newAge; 
- (int)age;

@end
类的实现:
#import "Cat.h"

 @implementationCat

 - (void)setAge:(int)newAge {
   age = newAge;
}
- (int)age {
    return age;
}
@end

在通常情况下,我们在Main函数中经常如下使用:

#import <Foundation/Foundation.h>
#import "Cat"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Cat *cat= [[Catalloc] init];
        
        // 设置age的值
        [cat setAge:10];
        
        // 取出age的值
        int age = [cat.age];
        
        NSLog(@"age is %i", age);
        
    }
    return 0;
}

2. 其实我们不必这样麻烦,点语发,是可以代替上面的功能的,代码如下:

#import <Foundation/Foundation.h>
#import "Cat"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Cat *cat= [[Catalloc] init];
        
        // 设置age的值
        cat.setAge=10;
        
        // 取出age的值
        int age = [cat.age];
        
        NSLog(@"age is %i", age);
        
    }
    return 0;
}

这样应该看起来很亲切了吧,但是这种用法,是和上面Java以及C#中原理是不一样的。

这只是看起来像而已

OC点语法的本质是方法调用,不是直接访问成员变量。

如下分析,当使用点语法是,其实OC是将 左边的转换为右边的

cat.setAge=10;        ------->        [cat setAge:10];
int age = [cat.age];  ------->   int age = [cat.age];  

所以,我们应该记清楚,这用点语法,仅仅是方便我们使用而已。  

3.需要注意一点的是,当self和 . 有时在一起使用时会遭成死循环。

例如:
- (void)setSpeed:(int)newSpeed  
{      
       self.speed = newSpeed;  
}  
其实他会展开为:
[self setSpeed: newSpeed]
这样是不是就很明显了呢?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值