1 . objective - c运行时检查在启动时执行的图像来确定是否运行垃圾收集。每个对象文件信息的部分,他们都必须同意继续执行。标准的编译结果在一个信息部分,表明没有GC能力。编译与-fobjc-gc表明,GC和保留/释放逻辑。编译-fobjc-gc-only表明只有GC逻辑。non-GC可执行,尝试加载gc-only框架将会失败,将能够执行GC,所加载一个GC无法框架(或包)。
2 .编译器在作业时使用的三个“助手”功能强大到垃圾收集内存的指针到全局内存(objc_assign_global),垃圾收集堆内存(objc_assign_ivar)或未知的记忆(objc_assign_strongCast)。作业的弱指针它使用objc_assign_weak和读取它使用objc_read_weak。
线程
收集器最初只运行在主线程要求通过objc_collect_if_needed(1),这被称为自动从NSAutoreleasePool排水方法。AppKit安排叫objc_start_collector_thread()发射后,随后集合上运行专用的线程,并对纯分配需求。objc_set_collection_threshold和objc_set_collection_ratio调用用于建立一个集合的“需要”。一次比时代一个完整的(完成)收集会发生;否则将完成分代收集如果分配超过阈值。
垃圾收集器最小暂停的线程已经登记,同时收集。注册发生在建立一个NSThread对象,而不仅仅是pthread。
重要的是:
一个关键假设收集器是一个线程没有获得访问一个对象(或更一般的任何垃圾收集的内存块)通过一个指向另一个线程的栈内存。换句话说,收集器不会让准备跨线程堆栈引用。这使收集器,以避免暂停所有线程在同一时间同时检查递归他们所有的引用。
垃圾收集的错误
在/usr/lib/libauto.dylib收集器本身是发现。它的错误消息是使用malloc_printf印刷。在/usr/lib/libobjc.dylib ObjC运行时被发现。它使用_objc_inform印刷错误。目前,复活和引用计数下溢错误指出通过调用以下例程:
objc_assign_global_error
objc_assign_ivar_error
objc_exception_during_finalize_error
auto_zone_resurrection_error
auto_refcount_underflow_error
属性
objective - c的语法属性WWDC 2006年以来一直在进行。有关详细信息,请参阅属性文件(属性)。
总之,@property(属性)类型名称引入了一个隐式声明的“getter”和“setter”方法(除非请求一个只读属性)的“变量”命名。setter =和getter =属性允许指定一个方法的名称,否则“名字”方法和“setName:”方法是隐式声明。他们也可以显式命名。
默认情况下,对象属性被分配当设置。在non-GC这通常是不正确的,发出一个警告除非显式赋值语义命名。有三个选择:分配,是对非保留对象引用,复制、复制和隐式对象保留;时要求被保留,保留对象集。
访问属性默认为原子。这是几乎所有琐碎的GC下也下琐碎non-GC一切但对象和结构。特别是non-GC条件下原子访问保留对象可以是昂贵的。因此,一个nonatomic财产属性。
指针可能受到强烈GC通过声明他们强烈,而且他们可以归零法弱__weak通过声明它们。
实现属性可以提供的编译器和运行时通过使用@synthesize @ implementation节中声明的类(或类扩展)。编译器将一个实例变量的名称相同的属性。如果你想使用一个不同的名称,您供应@synthesize声明。
特别是编译器和运行时将实现保留对象的访问器通过使用原子比较和交换指令。是极其危险的直接访问一个原子对象属性通过实例变量因为另一个线程可能改变其值不可预知的。这样编译器会警告你这样的不受保护的访问。事实上,运行时将暂时使用最低有效位的实例变量作为临时锁定,同时保留新值和释放旧的。直接使用一个原子实例变量在non-GC强烈气馁。
加载和卸载包
从OS X v10.4已经可以卸载包包含objective - c。没有尝试要防止这种情况如果对象仍然存在类卸载。子类的类加载包是特别脆弱的。
方法和类属性
objective - c现在支持一些gcc objective - c方法的属性。语法、属性方法按照方法的声明,为方法参数和属性参数类型和参数名坐着。支持的属性包括:
运行时API的变化
objective - C运行时的C接口(在< objc / * . h >)有了明显的改变。亮点包括:
几乎所有的结构都是弃用,包括struct objc_class。对于大多数提供的这些功能替代。
class_poseAs弃用。使用方法列表操作函数。
class_nextMethodList弃用。使用class_copyMethodList代替。
class_addMethods弃用。使用class_addMethod代替。
objc_addClass弃用。使用objc_allocateClassPair和objc_registerClassPair代替。
一般来说,所有弃用声明在64位都不存在。
objc / objc-runtime API。h和objc / objc-class。h现在objc /运行时。h和objc / message.h。旧头文件简单的# include新的
开发者:欢迎加入iOS开发交流群,群号码:314846081
网友评论