代码之家  ›  专栏  ›  技术社区  ›  cpjolicoeur

关于@property和@synthesis保留属性的问题

  •  1
  • cpjolicoeur  · 技术社区  · 16 年前

    我对Objective-C编码(如这个问题所证明的)还是相当陌生的,我认为我不完全理解如何在@property声明中使用retain属性。

    下面是一个示例类:

    @interface Foo : NSObject {
        NSMutableArray *myArray; 
    }
    
    @property (retain) NSMutableArray *myArray;
    

    我的理解是,将retain属性添加到@property声明(并在实现文件中使用必要的@synthesis delcaration)基本上将为我执行以下setter和getter操作:

    - (void)setMyArray:(NSMutableArray *)newArray {
        myArray = [[NSMutableArray alloc] initWithArray:newArray];
        [newArray release];
    }
    
    - (NSMutableArray *)myArray {
        return myArray;
    }
    

    这是准确的还是我在retain属性的工作方式上弄错了?

    3 回复  |  直到 16 年前
        1
  •  5
  •   Georg Schölly Crazy Developer    16 年前

    添加retain属性将实际生成此代码:

    - (void)setMyArray:(NSMutableArray *)newArray {
        [newArray retain];
        [myArray release];
        myArray = newArray;
    }
    
    - (NSMutableArray *)myArray {
        return myArray;
    }
    

    原因 保持 方法之前在NewArray上调用 释放 在旧值上,如果newarray和myarray是同一个对象,则在再次保留之前,将释放该数组。

        2
  •  1
  •   Georg Schölly Crazy Developer    16 年前

    很难做对。看看这篇文章 Memory and thread-safe custom property methods 马特·加拉赫的《带着爱的可可》。

    这里是 在很大程度上受到 that excellent article .

    - (void)setSomeString:(NSString *)aString {
        @synchronized(self)
        {
            if (someString != aString) // not necessary, but might improve
                                       // performance quite a bit
            {
                [aString retain];
                [someString release];
                someString = aString;
            }
        }
    }
    
    - (NSString *)someString {
        @synchronized(self)
        {
            id result = [someString retain];
        }
        return [result autorelease];
    }
    
        3
  •  0
  •   Mike Weller    16 年前

    retain 不会复制新值。它将保留新值并释放旧值。