【问题标题】:What is the meaning of nonatomic and retain in a property declaration属性声明中的非原子和保留是什么意思
【发布时间】:2011-07-06 10:36:24
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    您可能应该阅读The Objective C Programming LanguageDeclared Properties 章节。

    【讨论】:

    【解决方案2】:

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

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

    例如

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

    每次你输入self.variableName,它都会调用由@property创建的setter方法

    【讨论】:

      【解决方案3】:

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

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


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

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

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


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

      alloc -> init -> retain -> release

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

      【讨论】:

        【解决方案4】:

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

        你的代码行:

        @property(nonatomic, retain) UIView *singleTapView;

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

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

        但是,当您使用时:

        @property(nonatomic, assign) UIView *singleTapView;

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

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

        【讨论】:

          【解决方案5】:

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

          对于 retain 部分,此代码将对您有所帮助。它类似于@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];
          }
          

          【讨论】:

            猜你喜欢
            • 2010-10-23
            • 1970-01-01
            • 1970-01-01
            • 2019-06-21
            • 2017-10-07
            • 1970-01-01
            • 1970-01-01
            • 2014-09-20
            • 1970-01-01
            相关资源
            最近更新 更多