iOS OC 基础知识整理

1 @synthesize和@dynamic的区别

在Objective-C中,@synthesize 和@dynamic用于实现属性(property)的自动或手动合成。它们告诉编译器如何处理类中声明的属性。

@synthesize

  • @synthesize指令用于告诉编译器自动生成getter和setter方法。
  • 在早期的Objective-C版本中,如果你声明了一个属性,你需要使用@synthesize来明确要求编译器为该属性自动生成相应的存取方法。从Xcode 4.4及iOS 6开始,Apple引入了默认的自动合成,这意味着对大多数属性,你不再需要显式地使用@synthesize
  • 使用@synthesize还可以指定一个不同的实例变量名,例如:@synthesize propertyName = _customName;这会生成带有自定义实例变量名的getter和setter

@dynmaic

  • @dynamic告诉编译器,属性的getter和setter方法将由用户在其他地方提供,或者在运行时动态提供,防止编译器自动生成。
  • 使用@dynamic时,你负责在类的实现中提供或动态生成这些方法。如果访问了未实现的@dynamic属性,程序可能会因为找不到方法实现而崩溃。
  • 这通常用于NSManagedObject子类的Core Data属性,或者当你想要完全控制属性访问方式时。

2 OC属性和成员变量的区别

在Objective-C(iOS开发语言)中,属性(Properties)和成员变量(Instance Variables,也称为实例变量或ivars)是两个基本概念,它们用于定义类的状态。虽然这两者都可以用来存储数据,但它们之间存在一些关键区别,并且各有其适用场景

1. 定义方式

  • 属性通过@property关键字声明。属性自动产生一个后台实例变量(默认情况下,编译器会自动生成一个带有_前缀的成员变量),并为这个属性生成getter和setter方法(除非指定为readonly)。
  • 成员变量直接在类的实现文件中或接口文件的{}中声明。

2. 访问方式

  • 属性访问时,通常使用点语法或者通过显式调用其getter和setter方法。通过属性访问可以享受到Objective-C提供的内存管理(比如retain, copy, strong, weak等属性)和KVO(键值观察)。
  • 成员变量通常直接通过对象内部访问,不会经过getter和setter。这意味着访问成员变量不会触发属性的副作用,如KVO通知、内存管理操作等。

3. 使用场景

  • 属性应该是你的首选,特别是当你需要对外公开数据时,或当你需要利用Objective-C的内存管理特性时。属性确保了数据封装、内存管理和线程安全。

  • 成员变量通常用于内部状态管理,当你想要避免属性所带来的额外开销(比如getter和setter调用的开销)时。也适用于初始化方法中,避免触发setter的副作用。

  • 总结

  • 总而言之,属性和成员变量各有用途。在实际开发中,推荐优先使用属性,因为它提供了更好的封装性、内存管理和易用性。成员变量则适用于你需要更细粒度控制或避免属性机制带来的某些开销时。正确地使用属性和成员变量,可以使你的代码更加健壯、易维护。

你可能感兴趣的:(ios)