What equivalent code is synthesized for a declared property?

前端 未结 2 764
感情败类
感情败类 2020-12-06 08:42

How exactly getter and setter methods body looks like after they have been automatically synthesized ?

From official documentation I found so far only recommended im

相关标签:
2条回答
  • 2020-12-06 09:21

    When declaring a property as nonatomic, you'll get the following:

    // .h
    @property (nonatomic, retain) id ivar;
    
    // .m
    - (id)ivar {
        return ivar;
    }
    
    - (void)setIvar:(id)newValue {
        if (ivar != newValue) {  // this check is mandatory
            [ivar release];
            ivar = [newValue retain];
        }
    }
    

    Note the check ivar != newValue. If it was absent, ivar could be dealloc'ed after release, and the following retain would cause a memory access error.

    When you declare your property with copy, the code will look almost the same, with retain replaced by copy.

    For assign, it is even simpler:

    - (void)setIvar:(id)newValue {
        ivar = newValue;
    }
    

    Now, when you declare your property as atomic (this one is the default), things get slightly more complicated. A snippet similar to the one below was posted by one of Apple's engineers on the development forums:

    - (id)ivar {
        @synchronized (self) {
            return [[self->ivar retain] autorelease];
        }
    }
    
    - (void)setIvar:(id)newValue {
        @synchronized (self) {
            if (newValue != self->ivar) {
                [self->ivar release];
                self->ivar = newValue;
                [self->ivar retain];
            }
        }
    }
    

    Note the @synchronized block in both methods and additional retain-autorelease in the getter. Both those things ensure that you will either get the previous value (retained and autoreleased) or a new one in the case the value is changed by some thread while you are trying to read it.

    0 讨论(0)
  • 2020-12-06 09:31

    It depends on the attributes you set, for instance with a RETAIN attribute...

    - (void)setAProp:(AnotherClass *)value {
       [aProp release];
       aProp = value;
       [aProp retain];
    }
    

    For ASSIGN attribute....

    - (void)setAProp:(AnotherClass *)value {
       aProp = value;
    }
    

    For COPY attribute (used with NSString)...

    - (void)setAProp:(AnotherClass *)value {
       aProp = [value copy];
    }
    
    0 讨论(0)
提交回复
热议问题