`
bengan
  • 浏览: 204442 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Objective-C的Properties

阅读更多
Objective-C是苹果为Cocoa框架下设计的面向对象语言,最早为开发Mac平台的程序服务,但现在随着iOS平台的兴盛,Obj-C渐渐也变为主流语言之一了,我自己也没想到过要和Obj-C打交道,但现在的工作是开发Civilization Revolution的iOS版本,自然要迎头赶上。

Obj-C目前给我感觉最大的不同并非是代码的写法上,而是在一些设计模式的固定套用上;虽然代码看上去和一般意义上的程序语言区别挺大,但其实明白了他写法上的规定还是可以当C++一样来读;但是其中Properties和对内存的管理上一些约定俗成的用法倒是很容易让刚上手的人感到迷惑和困解,在这里做一个简单的总结以为备用。

Properties的初衷是为了简化程序员在构建不同的类的时候要重复去写相应的Getter和Setter函数,当我对一个类中的成员变量使用了Property声明的时候,那么编译器会自动为我们构建- (float)value;和- (void)setValue:(float)newValue;这两个方法。当然这两个方法的创建是在编译的时候来进行的,我们实际上是可以自己来写这两个方法的,那么即使我们声明了Property对象,编译器会自动跳过我们人为写好的Getter或者Setter函数。关于Property的使用和语法规则可以详查苹果官网的文档。

而其实Properties真正容易让人迷惑的是他的attributes(属性),不同的属性决定了变量不同的生命周期以及他们是如何在内存中运作的,稍有理解不对轻则造成内存泄漏,重则造成Crash,所以在动手写之前一定要保证你明白了该如何运用这些属性:

    readwrite、readonly:这两个比较好理解,决定了变量是否是只读的,如果声明readonly的话系统将不会构建Setter函数。readwrite是默认的。
    strong:强引用,这是iOS5加入ARC机制以后新加入的关键词,只要有强引用指向一个变量,那么这个变量就不会被释放。我目前的理解是配合weak用来代替retain使用的,但是目前我们的游戏里还是使用retain为多,strong的理解还是停留在文档上的,往后我的理解加深了,会再来这里更正~
    weak:弱引用,同样是随着ARC机制新加入的,如果没有强引用指向,那么即使再多的弱引用指向的变量依然会被释放掉,貌似是用来防止野指针的……
    assign:可以理解为assign有着和C++对象一样的行为,在赋值的过程中不会做任何额外的操作,换句话说就是如果是assign类型的属性,那么程序员应当自己对变量的申请与释放负责,苹果建议当使用int,bool,CGRect这类简单数据类型时来使用assign。assign是默认属性。PS:我在苹果的论坛中看到别人的经验是delegate是一定要用assign的。
    retain:保存类型,苹果引入这个的目的主要是为了为obj-c对象服务的,比如NSData或者NSArray,简单的说可以理解为指针拷贝,当有一个retain对象指向一个变量时,该变量的引用数要+1,而在程序中对任意一个指向该变量的retain属性使用了release操作实际上仅仅是对这个变量的引用数-1,也就是说只要还有retain对象在引用这个变量,那么它便不会被销毁,只有当引用数为0时,系统才会销毁这个变量。这个其实很复杂……说实话我现在还是没有完全弄明白关于retain对象调用release和直接赋值nil的区别……每一个iOS程序员都要过这一关,我想苹果也是明白这个属性的引入实际上更增加的内存管理的负担和风险才在iOS5中引入了strong和weak来代替retain和assign的。
    copy:这个可以和retain结合来理解,和retain相同的是,两者在收到新的赋值时都会先对原来的对象进行一次release操作(retain是引用数-1,而copy则是直接销毁了),而不同的是retain的实际赋值是指针拷贝,而copy是内存拷贝,是复制一份新的内存数据出来。像NSString类型一般是多用copy的。
    nonatomic:这个与多线程有关,系统默认的属性是其相对立的atomic,如果是atomic属性的对象,系统在生成Setter和Getter时会加入互斥锁机制,保证属性在多线程环境下内容的安全;而如果人为的声明nonatomic,系统在生成Setter和Getter则不会加入这些了,虽然加入互斥锁好处很多,但是同样的带来的系统负担会增大很多,在Mac开发中多数属性是使用atomic的,这也是其为何是默认的缘故,但是在iOS开发中目前为止所要面对的多线程环境还很有限的,而使用nonatomic又可以极大的节省移动设备上有限的机能,所以这也就是为什么在iOS代码中可以看到绝大多数的属性都是nonatomic的了。
    autorelease:autorelease声明的属性对象会在程序跳出其生命周期之外时自动释放掉(通常是return)

另外要提一点的是文档中提到因为Properties实际上算是一种设计模式,虽然使用Properties声明过的变量我们还可以理解其为变量,但实际上当我们使用“.”操作来访问它时,它已经是一种方法了,而在这个方法中会有这系统自己嵌入的关于retain和release的诸多操作,所以当我们访问Properties的对象时,好的习惯是使用self.xxxx来访问,切忌偷懒少打self,因为在有些时候会有retain和release操作不当的情况而造成内存泄漏。

这篇里肯定还有很多自己的误解和不当的地方,随着以后进一步学习iOS的深入后再来完善吧~
分享到:
评论

相关推荐

    Objective-C基础教程(入门教程).pdf

    类由属性(Properties)和方法(Methods)组成,它们在Objective-C中被统称为成员(Members)。 4. 构造器(Constructors):Objective-C中的构造器用于初始化对象实例。虽然语言本身不直接支持构造器,但通常在类...

    Objective-C程序设计 第6版 pdf

    4. **Objective-C 2.0新特性**:第六版可能会涵盖Objective-C 2.0引入的一些新特性,如垃圾回收、属性(properties)和块(blocks)等,这些都是现代Objective-C编程不可或缺的部分。 5. **内存管理**:Objective-C...

    Objective-C.2.0 中文版.pdf & Objective-C.chm

    Objective-C 2.0主要引入了轻量级垃圾收集(LLGC)和属性(properties)的改进,使得代码更加简洁易读。此PDF文档可能会详细讲解这些新特性,同时涵盖与CHM文件相同的基础知识,但用中文进行解释,这对于中国开发者...

    Object-C语言教程:Objective-C 简介

    Objective-C是一种主要应用于苹果操作系统上的编程语言,它是C语言的一种扩展,支持面向对象编程特性。Objective-C最初由Pike International公司的Brad Cox和Tom Love于1983年设计,并在1986年由NEXTSTEP系统引入。...

    Objective-C程序设计

    首先,Objective-C是在C语言基础上扩展的,它引入了消息传递机制和类的概念,这使得它具有高度的灵活性和可扩展性。在Objective-C中,对象通过发送消息来执行操作,这种机制类似于其他语言中的方法调用。消息传递的...

    Objective-C 2.0编程语言(Apple Inc.)The Objective-C 2.0 Programming Language (Apple Inc.)

    Objective-C是C语言的一个超集,它添加了Smalltalk风格的消息传递机制,使得对象间的交互更加直观。 自2009年以来,Objective-C经历了多个版本的迭代和改进,其中Objective-C 2.0是该语言较为显著的一个升级版本,...

    Effective Objective-C(原版)

    1. **Objective-C基础**:Objective-C是苹果平台的主要编程语言,基于C语言并扩展了面向对象的特性。书中会介绍类、对象、消息传递等基本概念,以及与C++的交互方式。 2. **协议(Protocols)**:Objective-C的协议...

    基于Objective-C的面向对象编程

    Objective-C是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,增加了Smalltalk风格的消息传递机制。Objective-C在iOS和macOS开发中扮演着核心角色,是构建Apple生态系统应用的主要语言。 在"基于...

    Manning.Objective-C.Fundamentals.Sep.2011.rar

    Objective-C是Apple开发的C语言的超集,主要用于构建iOS和macOS平台的应用程序。 1. **Objective-C概述** Objective-C是在C语言基础上添加了Smalltalk式的面向对象特性,包括消息传递机制、类和对象的概念。这本书...

    Learn_Objective-C(zh)(v2)

    Objective-C基于C语言,所以这部分内容对熟悉C语言的开发者来说相对容易。 2. **Objective-C的对象和类**:Objective-C是一种面向对象的语言,所以它会深入讲解类的定义、继承、封装和多态等概念。还会涉及实例变量...

    Objective-C 基础教程源码

    Objective-C 是苹果公司开发的一种面向对象的编程语言,主要用于 macOS 和 iOS 操作系统的软件开发。它是C语言的一个超集,引入了Smalltalk式的消息传递机制,使得编程更加灵活且易于理解。本教程的源码旨在帮助初学...

    objective-c 2.0程序设计源码

    在Objective-C中,".h"文件通常包含类的接口(Interface),定义了类的公共部分,包括属性(Properties)和方法(Methods)。".m"文件则是实现文件,包含了类的具体实现细节。由于这里只提供了".h"文件,我们可以...

    Effective Objective-C 2.0&Obj;-C高级编程

    Objective-C是一种强大的面向对象的编程语言,特别是在iOS和macOS应用开发中占据核心地位。"Effective Objective-C 2.0&Obj-C高级编程"这个压缩包文件包含了关于这个语言的深入学习资料,旨在帮助开发者提升他们的...

    From C++ To Object-C(中文版

    - **属性(Properties)**: 属性是Objective-C 2.0中引入的一个重要概念,它使得访问对象的实例变量更加简便。通过使用@property关键字,开发者可以轻松地定义读写属性,并自动生成相应的getter和setter方法。 - **...

    Objective-C2.0程序设计 答案

    Objective-C是一种面向对象的编程语言,它是C语言的超集,主要用于Apple的Mac OS X和iOS操作系统。在Objective-C2.0中,苹果引入了一些改进和优化,使其更易用且效率更高。以下是对Objective-C2.0程序设计中一些关键...

    Objective-C Programming: The Big Nerd Ranch Guide (2nd Edition)

    Objective-C Programming: The Big Nerd Ranch Guide (2nd Edition).epub (epub 格式) Want to write iOS apps or desktop Mac applications? This introduction to programming and the Objective-C language is ...

    objective-c 程序设计 + 代码

    2. **属性(Properties)**:Objective-C的属性提供了封装,提供了访问器方法(setter和getter)以及内存管理特性如`nonatomic`和`atomic`,`assign`,`strong`,`weak`,`copy`等。 3. **构造方法(Init Methods)...

    iPhone开发资料之Objective-C语言简介

    Objective-C中的属性(Properties)提供了一种声明和访问对象数据的方式,同时也处理了内存管理和数据访问的细节。属性的声明使用`@property`关键字,而实现使用`@synthesize`: ```objc @interface MyClass : ...

Global site tag (gtag.js) - Google Analytics