3

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

我已经使用@property 很多次了,但实际上并不知道该(nonatomic, retain or assign or copy)功能的确切含义。任何人都可以帮我解决这个问题。谢谢

4

5 回答 5

9

这是一个应该更频繁地提出的问题。

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


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

如果您使用默认值(即atomic),则 @synthesized 方法使用对象级锁来确保对属性的多次读取/写入被序列化。正如苹果文档指出的那样,这并不意味着整个对象是线程安全的,但属性 reads/writes 是。

如果您编写自己的访问器方法,那么这将无济于事。但是大多数程序员还是写了它。


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

alloc-> init-> retain->release

做事的循环。基本上,除了布尔值和整数之类的原语之外,您将使用它来处理所有内容。

于 2011-03-01T11:29:21.240 回答
4

您可能应该阅读The Objective C Programming Language的Declared Properties一章。

于 2011-03-01T11:19:39.057 回答
4

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

您的代码行:

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

意味着您正在为 UIView 编写 getter 和 setter 方法。

每当您在代码中的任何位置使用它时,它都会自动保留或增加 UIView 的保留计数。

但是,当您使用:

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

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

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

于 2011-03-01T11:33:30.053 回答
1

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

getter 和 setter 的工作方式取决于您声明 @property 的方式

例如

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

每次您键入self.variableName它时,它都会调用它的 setter 方法,该方法由@property

于 2011-03-01T11:25:14.600 回答
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];
}
于 2013-10-14T11:44:07.813 回答