zoukankan      html  css  js  c++  java
  • @synthesize obj = _obj 理解

    在很多代码里可以看到类似得用法:

    @interface MyClass:NSObject{  
            MyObjecct *_object;
    }
    @property(nonamtic, retain) MyObjecct *object;
    @end
    
    @implementatin MyClass
    @synthesize object=_object;
    

      

    (1)32位系统和64位系统的差异

        在32位系统中,如果类的@interface部分没有进行ivar(instance variable)声明,但有@property声明,在类的@implementation部分有响应的@synthesize,则会得到类似下面的编译错误:

        Synthesize property ‘xX’ must either be named the same as a compatible ivar or must explicitly name an ivar

        在64位系统中,运行时系统会自动给类添加ivar,添加的ivar以一个下划线“_”做前缀。

    (2)避免莫名其妙的Bug

        在这里简单说一下_object和object的区别。_object是MyClass类的成员变量,object是属性。property和synthesize定义了一对getter和setter方法,在这里的getter方法是object,setter方法是setObject,事实上getter和setter方法操作的是变量_object。

        如果写synthesize objec = _object 时getter方法为:

    -(MyObject *)object
    {
        return _object;
    }

        如果写synthesize object 时getter方法为:

    -(MyObject *)object
    {
        return object;
    }

        当函数名和属性名重名的时候会出现意想不到的错误,为了避免这种Bug,Apple给的Demo Code里面多数也采用这种方式。

    (3)属性和变量的用法

        属性是用self.object,通过getter方法来调用的,可以在类外使用。而变量是通过_object来调用,只能在该类对应的implementation中使用,在类外不能使用。

        下面看一下两种赋值操作:

       
    
     self.object = [[MyObject alloc] init];
    _object = [[MyObject alloc] init];
    

      

        第一种的方式和@property(nonamtic,retain)有关,实际上是通过调用setter方法setObject来实现赋值的。第二种方式是简单的指针赋值,没有调用setter方法。

        下面是retainCount的变化:

    MyObject *tmp = [[MyObject alloc] init];
    self.object = tmp;  //retainCount = 2
    [tmp release];  //retainCount = 1
    _object = [[MyObject alloc] init];  //retainCount = 1
    

      

  • 相关阅读:
    微信公众号-框架业务
    微信公众号-加解密数据demo坑
    JS进制转换,浮点数相加,数字判断
    lamp环境-编译安装
    批量解压目录下的文件
    设置用户sudo -s拥有root权限
    CentOS 6.5-默认没开启网络连接:开启网络连接
    检查一下是否安装了环境,安装则卸载
    负载均衡-多台机子session不起效:把php.ini中file改为memcache存储
    由json生成php配置文件
  • 原文地址:https://www.cnblogs.com/fengjian/p/3314810.html
Copyright © 2011-2022 走看看