Tag:

祖传财产!

对于Objective C类的starters属性而言,它是为实例变量以及最近为类成员定义getter和setter方法的简捷方法。 它们还帮助提供数据封装。 属性可用于定义实例变量或类变量的各个方面。 这些版本方面是 1.原子性 2.内存管理语义 3.可读性和可写性 4.存取器名称 5. Swift导入语义 只是为了演示属性包含的信息量,让我们定义一个简单的信息,然后尝试描述其实际含义。 @property NSString *名称; 它是原子的,强壮的,可读写的属性,将导致getter`name`和setter setName:`的合成,然后将其作为隐式展开的可选内容导入swift! 让我们谈谈这些方面的每一个。 有组织 任何属性都可以是原子的或非原子的。 通过getter访问原子属性时,它会返回该属性的有效值。 您可能想知道,getter应该返回一个有效值,什么是无效值? 在多线程环境中,当多个线程试图同时读取/写入属性时,指定属性为原子将确保在执行setter的过程中不会返回getter。 这意味着使用getter检索的值是在另一个线程执行写操作之前或之后,这仅保证该值不是无效或未完全写入。 这与线程安全性不同。 此外,在iOS平台上使属性原子化的成本非常高,因此很少使用此功能。 该实现使用自旋锁来确保多个线程不会同时读取写入。 内存管理语义 这些属性定义属性的设置方法在内存管理方面的行为。 即,当将新值设置为属性时,对象是否会被保留或复制或仅被分配。 在我们深入探讨此问题之前,您需要了解内存管理在ARC中的工作方式,本文不对此进行介绍。 属性的最重要属性是它的内存管理方面,您可以将任何属性指定为以下任一属性 分配 弱 强大 unsafe_unreatined 复制 让我们探索这些 @属性(非原子的,分配)CGPoint中心; @属性(非原子,指定)CGFloat高度; 当setter只需要分配要设置的值时,可以使用assign。 这用于分配值类型,如上所述。 通常将值类型复制到目标变量,并且该值的生存期是该变量的范围。 对于指向在堆上为任何值类型或值类型的集合分配的内存的指针,需要调用显式的free,即需要手动管理内存。 @property(nonatomic,weak)id 委托; @property(nonatomic,weak)id 数据源; 在上面的示例中,您看到了weak的使用,weak用于指定不保留分配的对象,相反,引用仅指向该对象,直到其有效为止,因此不影响该对象的寿命。 当属性保留对其的引用时,仍可以在任何时候释放该对象,如果引用弱,则在对象被取消初始化后,引用将指向nil。 自iOS 5 SDK以来,弱引用可用,在此之前,您可以使用unsafe_unretained来指定相同的行为,但是在取消初始化对象时,无需对引用进行零位或清零。 特别提到弱引用,它们在块的情况下用于捕获“ self”的值,以使该块最终不会对其捕获的对象具有潜在的保留周期。 […]

了解目标C的弱项和强项

积木很棒。 为了避免保持周期,您经常会看到“弱者自我” —“强者自我”舞蹈 __weak __typeof __(self)weakSelf =自我; self.block = ^ { __typeof __(self)strongSelf = weakSelf; [strongSelf doSomething]; [strongSelf doSomethingElse]; }; 复制时块是对象 块在堆栈上创建,并且在其堆栈帧返回时将消失。 在堆栈上时,块对其所访问的任何内容的存储或生存期均无影响。 如果在堆栈帧返回后需要存在块,则可以将它们复制到堆中,并且此操作是显式操作。 这样,一个块将作为可可中的所有对象获得引用计数。 复制它们时,它们会随身携带其捕获的范围,并保留它们引用的所有对象 块可以从封闭范围捕获值 除了包含可执行代码之外,块还具有从其封闭范围捕获状态的能力。 请注意,代码块会捕获变量及其修饰符(即弱限定符), =>这说明了为什么需要将self声明为 __weak 当执行块时,对于第一种方法(doSomething),weakSelf可能为非零;而对于第二种方法(doSomethingElse),不可以使weakSelf不为nil。 您可能会认为,起初,这是在块内使用self来避免保留周期警告的技巧。 不是这种情况。 在块执行时创建对self的强引用,而在块声明时评估在块中使用self,从而保留对象。 但是,为了获得最佳实践,应该使用弱对象为对象创建强引用。 这也不会创建一个保留周期,因为该块内的强指针仅在该块完成之前才存在(唯一的作用域是该块本身)。 =>这说明了为什么您需要声明另一个 __strong 自我 许多人指出,“块是在堆栈上创建的,当它们的堆栈帧返回时,它们就会消失。 在堆栈上时,块不会影响它所访问的任何内容的存储或生存期。” 即使块(在堆栈上声明)增加了对其访问的所有对象的引用计数,这也将是无用的,因为当函数返回时,该块将被丢弃 复制块时(您会看到人们通常为块声明属性(副本)),这将增加对其访问的所有对象的引用计数。 为什么? 因为块是要在以后的时间执行的,所以它需要保持对它访问的所有对象的强引用。 块可以执行很多次,所以运行后它不会释放自己。 当您取消该块时,它将被取消分配,因此将减少对其访问的所有对象的引用计数。 AFNetworking在调用该块后将其清除为零,因此您不必在块内使用weakself 因此,在某些情况下,您不必在块内使用weakself 确保没有复制该块,只需声明并运行它 确保该块在调用后为零 这是更多链接,可帮助您进一步探索 我终于想出了弱自我和强自我 使用块 […]