Tag: 属性

目标C:属性属性

Objective C属性,Objective-C中最困难的部分。 很多时候,即使是开发人员,甚至是StackOverflow,都让您在何时需要使用哪个属性时陷入困境。 最终,随着ARC(自动引用计数)出现在市场上的岁月,iOS中的内存管理得到了改进,在该市场中,我们无需为对象释放后定义的所有对象进行dealloc和deinit定义。 ARC版本的内存管理的发布使iOS中的开发变得更加容易,并且内存泄漏等情况会自动得到多次处理。 我们将在这里讨论的主要目标C属性是: 强:强是保留的新形式。 到iOS 4为止,我们一直使用retain代替strong 。 Strong仅定义对象的所有权。 对象的生命周期将一直保留,直到所有者本身未取消分配对象为止。 我们通常对对象的父级使用strong ,即在UI Elements的情况下,对UIViewController使用strong 。 保留:保留还拥有object属性。 在一般情况下,当我们要为同一对象使用新的设置器时,如果要删除先前的值,则使用保留 。 弱:弱只是一个指针,仅在对象由某个强大属性拥有时才起作用。 我们通常使用弱以避免保留周期。 保留周期仅表示如果A强烈指向B,B强烈指向C,并且在任何情况下C似乎也强烈指向A,那么它将在所有A,B,C属性之间产生死锁。 为了避免保留周期,我们通常使任一过渡都变弱,而不是强过渡。 弱属性通常与IBOutlet,Delegates和其他Objective-C参考一起使用。 分配:分配是弱属性的旧版本。 到iOS 4为止,我们一直使用分配代替弱属性。 Assign主要用于基本数据类型,例如int,float等。 原子:在线程安全的情况下,原子属性是默认属性,但可以用nonatomic覆盖。 原子属性定义属性是线程安全的,并且将始终返回真实值。 垃圾值的可能性是最小的。 由于它是线程安全属性,因此比其竞争对手nonatomic花费更多的时间执行。 NonAtomic:NonAtomic属性不是线程安全的,不能保证结果真实,但始终会给出结果。 简单的情况就可以理解,如果A将B设置为“ Srijan”,而C将B设置为“ Kumar”,则D可能会想要D获得B的值,这可能会产生类似“ Srimar”或“ janKum”,但非原子总是给出结果。 因为它不是线程安全的属性,所以它比atomic快。 对于几乎是类的对象,我们盲目使用非原子。 ReadOnly:顾名思义,readonly属性增强了该属性的接口,即其他对象只能读取该属性,而不能设置该属性的值。 我们使用只读,不想让其他类设置属性的值。 读写:这也是默认行为。 一旦你合成了一个属性,它就可以对该属性进行获取和设置。我们只需在实现模块中编写@synthesize即可 。

Swift 3中的属性(@ IBOutlet,@ escaping,@ UIApplicationMain,@ available)

快速编码时,您可能在某处遇到了@符号,这意味着您遇到了一个属性 。 快速语言内置了属性,以提供有关声明或类型的更多信息。 由于它们是内置的,因此您无需编写自己的属性,尽管它们有时可以采用参数。 使用属性类似于使用关键字(即,类,var,协议)—它们具有非常特定的实用程序,但它们并不相同。 主要区别在于关键字告诉编译器您正在定义的内容,而属性则告诉编译器您正在使用它的上下文。 在此示例中,关键字“ var ”表示您要创建一个新变量,而属性“ @IBOutlet”表示您要将该变量与接口生成器同步。 @IBOutlet允许您将代码连接到情节提要 ,并在代码中更改UILabel的属性。 还可以应用其他三个属性,以允许不同的声明与接口生成器同步。 您可以在变量声明上使用@IBInspectable 以允许在检查器面板中查看和编辑变量。 @IBAction用于方法声明,以将方法功能连接到接口构建器中的对象。 最后, @ IBDesignable可以应用于类声明,以允许在界面生成器中呈现类属性,而无需运行模拟器。 请记住,所有这些属性都是特定于“界面”构建器的,因此仅适用于UIKit中的类型。 其他例子 有关swift提供的所有属性的完整列表,可以查看此页面。 我将在这里复习一些常见的知识。 如果在创建项目后查看AppDelegate.swift文件,应该会看到@UIApplicationMain属性应用于您的AppDelegate类。 请记住,属性可以应用于任何类型的声明,包括类声明。 此特定属性为您的应用程序创建一个入口点,并指定应用程序委托。 这等效于在main.swift文件中调用UIApplicationMain(_:_:_ 🙂 。

祖传财产!

对于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”的值,以使该块最终不会对其捕获的对象具有潜在的保留周期。 […]

迅捷的懒惰属性

什么是惰性关键字? lazy关键字使您可以延迟存储属性的初始化,直到首次访问它为止。 您只能在结构或类中使用惰性。 //如果尝试在结构或类之外的属性上使用惰性,编译器会吐出错误: 惰性仅对结构或类的成员有效 您为什么要使用它? 有时无法初始化存储的属性,因为其值取决于尚未初始化的代码的其他部分,或者应在首次访问该属性之前不进行初始化,以便节省内存并提高速度甚至防止您的应用崩溃(例如从数据库中获取和/或排序数据) 在类中使用惰性属性 要看的东西: 惰性关键字 :使用此关键字延迟变量的初始化 使用闭包 :由于该属性的目的是延迟某些代码的执行,并且计算后的属性不能进行延迟初始化,因此我们使用闭包来初始化对象 ()在闭包末尾:这是闭包自身执行的方式。 如果不使用(),则只能将闭包分配给该变量而不执行它 初始化importFromDatabase类时,不会初始化lazy属性 当您调用lazy属性时,闭包将被执行 我在学习有关此问题时遇到了一些问题: 可以将lazy与常量一起使用吗? 不,您不能这样做,因为惰性属性的值仅在初始化后才计算,而常量则需要一个值 它对计算属性起作用吗? 不可以,因为总是重新计算一个计算属性,而惰性属性在初始化时仅计算一次。 为什么使用闭包? 由于该属性旨在执行代码,因此闭包是必经之路 为什么要使用惰性属性? 初始化对象时延迟执行代码

Swift计算的属性

在第一篇文章中,我将介绍计算属性以及如何使用Getters和Setters,以尝试将我在使用Swiftlang功能时学到的东西写在纸上。 计算属性 在跳入之前,需要了解一些重要的事情: 将它们视为一段代码,每次调用它们时都会计算出一个值 计算属性始终是变量(从不常量) 这些类型的属性可以在类,结构,枚举的内部或外部使用 当使用计算属性时要当心,因为它们的值可能在每次调用它们时都会改变。 而且,如果使用了setter,它们可以在其封闭范围内更改任何其他值(更多信息在下面)! 定义计算属性 首先,您必须编写一个变量并显式声明属性的类型,以帮助编译器知道将为其分配哪种类型的值。 不要分配默认值。 而是在类型声明之后打开方括号,然后开始使用吸气剂。 由于变量的值是通过使用setter和getter进行设置和检索的,因此您至少需要在方括号内使用getter,如下所示: 上面的代码中发生了什么: 您可以看到Int类型的计算属性,并且在其括号内,我使用吸气剂返回x + y的结果 一旦计算出的属性被调用,getter就被执行并且变量被赋值给结果 清理注意事项 :只要不实现setter,就不需要编写get {}。 这将加快您的写作速度 让我们谈谈获取器和设置器: 使用get {} get关键字使计算出的属性可读 使用getter可以从计算属性读取数据 在方括号内,编写代码,一旦计算属性被调用,该代码将被执行 访问该属性将执行getter 尝试为计算变量分配一个值。 发生了什么? 您不能将值分配给没有设置器的计算属性。 使用set {} 要了解的几件事: 关键字s et使计算出的属性可写。 没有它,您将收到以下错误: 无法分配值[您的计算属性的名称],它是仅获取属性。 当您为计算的属性分配值时,您正在调用设置器 该值可在设置器的括号内访问 您可以在set关键字后的括号内分配一个本地名称。 该局部变量将传递的值传递给计算属性(如在下例中使用newSalaryPerWeek所示) 如果您未在setter定义中提供分配值的名称,则编译器将自动分配newValue的名称。 通过设置,您可以更改同一作用域中其他属性的值,这是您必须知道链接到计算属性的所有依赖项的原因。 有点令人困惑,但这是计算属性能力的一个很好的例子,如下所示: 为什么不使用setter更改其自己的计算属性的值? 因为我会陷入一个无限循环中,一次又一次地将值分配给它自己。 在家尝试this 让我们将此知识应用于其他几个计算属性,但是这次在Enums / Structs / Classes内部,只是看到没有任何变化: 枚举中的计算属性 […]

快速的属性是什么?

在初学者级别,所有开发人员都对属性有一些疑问,例如什么是属性?什么类型的属性? ,什么时候使用哪种类型? 。 所以在这里我想快速给出一些有关属性的想法。 有什么属性? “简单来说,属性具有一些您想在应用程序或班级中出于任何原因访问的值” 例如 :- var intVal = 2; var strVal =“世界你好” 因此,在这些示例中,“ intVal”和“ strVal”是具有某些值的属性。 但是现在的问题是,财产是否总是具有某些价值? 没有任何动态价值? 答案是“是的,它可以具有运行时间(动态值)”。 所以现在属性类型出现了。 它有两种类型: 1)储物 2)计算财产 它以常量和可变值作为实例。 例如 1)变量a = 5 在这里,变量“ a”存储整数值5。我们使用var关键字定义了变量“ a”,这意味着其值b可以更改。 print(a)// 5 a = 7 //更新a的值 print(a)// 7 2)让a = 5 它的工作原理同上,但不同之处在于它的值无法更改。 a = 7 //编译器抛出错误 3)var a:整数! 这里我们没有给变量a赋值。 因此,Int的默认值会自动分配给变量a。 因此,当您不需要通过任何计算获得任何动态值时,可以使用var或let来使用存储的属性。 在开发过程中,某些情况下,由于计算能力有限或其他原因,您只想在需要时才创建一些对象。 […]

Swift中的实例属性与参数

前几天,我重构了代码。 我有 扩展MainController:TabBarViewDelegate {func buttonDidPress索引:Int){ 让initialIndex = tabBarView.selectedIndex 让WholeAppContentView = updateWholeAppContentView() view.addSubview(wholeAppContentView) } } 委托方法看起来不正确,因为很难区分所需的委托方法还是实例方法。 它也缺少一个主题。 我喜欢这个API设计后的文章,您可以阅读Rule 19: Always say who’s talking 这是一条简单的规则,同样容易犯错误。 在您的委托方法中,始终将发送方作为参数传递。 总是。 即使是单身人士。 即使对于您无法想象的事物,也可能会同时使用多次。 没有例外。 因此,我重构了代表并遵守了该代表。 扩展MainController:TabBarViewDelegate {func tabBarView(_ view:TabBarView,buttonDidPress index:Int){ 让initialIndex = tabBarView.selectedIndex 让WholeAppContentView = updateWholeAppContentView() view.addSubview(wholeAppContentView)//这是罪魁祸首 } } 即使MainController.swift只有1行更改,整个UI也会中断,因为所有视图都已添加到选项卡栏中。 range。 不久之后,我就记得如果parameter具有相同的名称,则该parameter优先于instance property 。 因此,在这种情况下,编译器会在没有警告的情况下假设您正在处理TabBarView视图 这就是为什么您经常使用self来消除歧义的原因。 struct用户:可编码,可平等{ 让firstName:字符串 let lastName:String init(firstName:String,lastName:String){ […]

iOS上的文本属性:轻松的方法

每个iOS开发人员在发现问题后都会感到a肿–他必须使用动态文本来实现标签,如下所示: 您知道您必须动手使用Apple的NSAttributedStringKeys字典,定义它们的键并附加所有这些AttributesTexts。 哦,我的……😱 然后您将开始执行以下操作: 在定义完字典之后,您将开始构建AttributedTexts,将其附加到最后将其分配给标签。 但… Xcode在Interface Builder中内置了一个漂亮的属性文本编辑器。 这让我想知道🤔 为什么不使用它,避免在源文件中对所有这些属性进行硬编码,而在xib中对其进行硬编码,而不是在您已经对许多属性进行硬编码的地方。 是的,但是我们如何在运行时动态更改这些内容? 您可以像使用静态文本生成器那样在界面生成器中构建属性文本,并填写一些占位符(例如),稍后我们将使用实际值替换这些占位符,并保留属性。 听起来不错,对吧? 2.您必须在utils文件中的某个位置定义扩展名,我将其命名为AttributeString + Replace。 我是 tapptitude 的iOS开发人员, tapptitude 是一家移动应用程序开发机构,专门为全球的初创企业和品牌构建高质量的iOS和Android应用程序。 查看我的其他帮派->

Swift iOS访谈:关于财产和财产观察员的一切

属性:属性是与特定类,结构和枚举关联的值。 属性基本上是两种类型。 1.储存财产: 存储属性可以存储变量和常量。 存储类和结构给出的属性。 商店属性无法在扩展名中定义。 2.计算财产: 计算属性是计算而不是存储。 由类,结构和枚举给出的计算属性。 计算属性始终是可变的。 计算属性提供getter和可选的setter 懒惰的存储属性: 直到使用时才计算其初始值的属性。 惰性存储的属性始终是可变的。 惰性属性的应用:属性的初始值取决于外部因素 , 而外部因素的值直到实例初始化完成后才知道。 GPS类{ 在里面() { 打印(“正在初始化GPS …”) } } 车类{ 惰性变量导航= GPS() } var car = Car() 在上面的示例中,在每种情况下都不需要导航属性。 物业观察员: 财产观察员观察并响应财产价值的变化。 每当值改变时都会调用它。 可以在存储属性(懒惰存储属性除外)上定义属性观察器。 可以为覆盖的存储和计算的属性定义属性观察器。 属性观察者不需要为非覆盖的计算属性定义。 类型属性:(静态) 不管您创建了多少个该类型的实例,这些属性只有这些属性的一个副本。 Type属性不能被覆盖。 您必须始终为存储的类型属性提供默认值。 静态 varstoredTypeProperty =“ Animesh” struct SomeStructure { static varstoredTypeProperty =“某些值。” 静态 var […]