nonatomic和retain在属性声明中的含义是什么?

时间:2011-03-01 11:17:49

标签: iphone objective-c ipad properties getter-setter

我是iOS编程的新手。任何人都可以告诉我以下代码行的确切含义 @property(**nonatomic, retain**) UIView *singleTapView;

我一直在使用@property很多次,实际上并不知道(nonatomic, retain or assign or copy)函数的确切含义..任何人都可以帮我这个.. 三江源

5 个答案:

答案 0 :(得分:9)

这个问题应该更频繁地提出来。

@property是一个简单的属性声明。这里没什么新鲜的。


nonatomic表示没有为相应的@synthesize访问器实现对象锁定,该属性只是直接提供。这比atomic快,但在多线程用例中可能导致部分写入值等。

如果使用默认值(atomic),则@synthesized方法使用对象级锁定来确保对属性的多个读/写序列化。正如Apple docs指出的那样,这并不意味着整个对象是线程安全的,但属性读/写是。

如果您编写自己的访问器方法,则不会执行任何操作。但大多数程序员无论如何都要写它。


保留的东西有点简单。基本上,这意味着您需要一个使用

的对象

alloc - > init - > retain - > release

做事的周期。基本上,你将把它用于除Booleans和Integers之类的原语之外的所有东西。

答案 1 :(得分:4)

答案 2 :(得分:4)

在iOS中使用属性来替换我们通常编写的getter和setter方法。

您的代码行:

  

@property(非原子,保留)UIView * singleTapView;

表示您正在为UIView编写getter和setter方法。

只要您在代码中的任何位置使用它,它就会自动保留或增加UIView的保留计数。

但是,当你使用:

  

@property(非原子,分配)UIView * singleTapView;

然后使用你的UIView,它的保留计数不会增加。这意味着它不会保留您的UIView。

“copy”仅用于将当前对象的值赋予新对象。

答案 3 :(得分:1)

当您声明@property时,您隐式创建该特定变量的getter和setter方法....

以及getter和setter如何工作取决于你如何声明@property

例如

@property(nonatomic,retain)将生成setter方法,其中保留计数将增加,并且变量将不是线程安全的......

每次键入self.variableName时,都会调用由@property

创建的setter方法

答案 4 :(得分:1)

对于非原子/原子部分,您应该阅读Atomic Operation。它不是特定于iOS,但会让您更好地理解

对于保留部分,此代码可以为您提供帮助。它类似于@synthesize将为您生成的内容

//getter
- (Book *)book
{
    return [[book retain] autorelease];
}

//setter
- (void)setBook:(Book *)aBook
{
    if (book == aBook)
    {
        return;
    }
    Book *oldBook = book;
    book = [aBook retain];
    [oldBook release];
}