`
cuichang
  • 浏览: 94985 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

iphone 开发中属性 property 和 synthesize 权威的介绍

阅读更多

在Objective-c 2 .0中引入了 property 和 synthesize 为方便存取 

 1 让大家认识一下 property  and  synthesize  吧 
@property预编译命令的作用是自动声明属性的setter和getter方法 
@synthesize也是一种新的编译器功能,表示“创建该属性的访问器”
废话少说~~ 下面更精彩哦~~~
下面我们来对比一下 有这两个属性和不用这两个属性的区别吧!!! 
----------------------------------
                              没用之前
----------------------------------
 // Student.h 

#import <Cocoa/Cocoa.h> 


@interface Student : NSObject { 
NSString *name; 
NSString *studentNO; 


- (NSString*)name; 
- (NSString*)studentNO; 
- (void)setName:(NSString*)aName; 
- (void)setStudentNO:(NSString*)aStudentNO; 

@end 


// Student.h 

- (NSString*)name 

return name; 


- (NSString*)studentNO 

return studentNO; 


- (void)setName:(NSString*)aName 

[name autorelease]; 
name = [aName copy]; 


- (void)setStudentNO:(NSString*)aStudentNO 

[studentNO autorelease]; 
studentNO = [aStudentNO copy]; 



main里面这么用: 

Student *hayes = [[Student alloc] init]; 
[hayes setName:@"Hayes"]; 
[hayes setStudentNO:@"00000"]; 

NSLog(@"Name: %@", [hayes name]); 
NSLog(@"Student NO: %@", [hayes studentNO]); 
---------------------------------
用了之后 
---------------------------------
// Student.h 
#import <Cocoa/Cocoa.h> 

@interface Student : NSObject <NSCoding> { 
NSString *name; 
NSString *studentNO; 


@property(copy) NSString *name; 
@property(copy) NSString *studentNO; 

@end 

// Student.m 
#import "Student.h" 

@implementation Student 

@synthesize name; 
@synthesize studentNO; 

@end 


在main函数里可以这么调用: 

Student *hayes = [[Student alloc] init]; 
hayes.name = @"hayes"; 
hayes.studentNO = @"00001"; 

NSLog(@"%@", hayes.name); 
NSLog(@"%@", hayes. studentNO); 

-------------------------------------
精彩内容 马上上演~~~
-------------------------------------
2 下面请允许我非常详细的给大家介绍一下 property 后面括号中的属性(nonatimic,retain,assign,copy,readonly,readwrite,)这些属性主要事完成getter setter 的操作  
(这个很重要的哦 !!!很多初学者都在这里迷惑哦~~~) 
------------------------------------------------
assign: 简单的赋值  不会更改索引计数(Reference  counting)主要是对基本数据类型使用 eg:(NSInteger,CGFloat 和C语言的 int double float char  ...)如果使用对象类型的参数,需要开启garbage collector
[现在的版本叫引用计数器 不同的版本不同的叫法  在mac编程和在iphone编程中的叫法也不同  谅解 谅解 ] 
retain: 释放旧的对象 将旧对象的值赋予输入对象 并将输入对象的索引计数+1 ,主要应用与NSObject与其子类中,如果启用了garbage collector 和assign 的作用一样 
  1. - (void)setName:(NSString *)newName {  
  2.     if (name != newName) {  
  3.        [name release];  
  4.        name = [newName retain];  
  5.        // name’s retain count has been bumped up by 1  
  6.     }  
  7. }  
copy: 创建一个索引计数为1的对象 释放掉原来的对象 
readonly:  表示只读属性  只会生成getter方法 不会生成setter方法 
readwrite:设置可供访问的级别 
nonatimic:非原子访问,不加同步 ,多线程并发访问提高性能 (对多线程的保护,防止在未写完,被另一个线程读取,造成数据错误)。
对copy 和retain的 解释 上面的语言太抽象了 那么请允许我在这里对 copy 和 retain 的区别 作详细的介绍

比如一个NSString 对象,地址为0×1111 ,内容为@”STR”

Copy 到另外一个NSString 之后,地址为0×2222 ,内容相同,新的对象retain为1 ,旧有对象没有变化

retain 到另外一个NSString 之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1 

retain 是指针拷贝,copy 是内容拷贝  

下面分享一个网友的总结

 

一直以来个人觉得如果一个类是的property是readonly的那么再指定其他的如assign/retain/copy这样的属性就实在是没有什么意义了。确实你想想既然都readonly了,肯定是没有setter的,既然没有setter那么谈assign/retain/copy又有什么意义呢?所以一直以来我从来不对readonly的property加retain/copy属性申明,默认assign就足够了,simple is beautiful!

但是我现在发现我错了,其实一直都有一种这种感觉,只是没有找到100%的充分理由为readonly加上retain/copy。但是假如你要在你的subclass改写property,而加入你要改写的是一个NSString,你像把这个属性设置为readwrite和copy,往往杯具就发生了,编译时候可恶的warning 产生了,因为copy和之前默认的assign明显不相同啊!

终上,不论什么时候,都要为你的readonly的对象属性加上合适的retain/copy申明。你现在不用,但不说明你将来就不会用,出来混迟早都要还的!

转自 http://blog.sina.com.cn/s/blog_63f5d1a70100uo9p.html

分享到:
评论
1 楼 handy.wang 2011-06-08  
最后:

但是我现在发现我错了,其实一直都有一种这种感觉,只是没有找到100%的充分理由为readonly加上retain/copy。但是假如你要在你的 subclass改写property,而加入你要改写的是一个NSString,你像把这个属性设置为readwrite和copy,往往杯具就发生了,编译时候可恶的warning 产生了,因为copy和之前默认的assign明显不相同啊!

这个确实说得对。

相关推荐

    iPhone开发基础教程_学习笔记

    在iOS开发领域,尤其是针对iPhone应用的开发,掌握基本的技术框架和编程语言是至关重要的。本教程主要聚焦于iPhone开发的基础知识,包括Object-C语言、界面设计和UIViewController的使用。 Object-C是iOS开发的主要...

    iPhone开发基础教程.pdf

    如果属性是对象,通常设置为`retain`,并使用`@property`和`@synthesize`关键字自动处理内存管理。在`dealloc`方法中释放所有已分配的内存。 9. **工厂方法与消息嵌套**:工厂方法是创建对象的一种简便方式,无需...

    Objecive-C语法与iPhone开发入门

    Objective-C是一种强大的面向对象的编程语言,主要用于Apple的iOS和macOS平台的软件开发,是构建iPhone、iPad等iOS设备应用程序的基础。本篇文章将深入探讨Objective-C语法与iPhone开发入门的相关知识点。 一、...

    让不懂编程的人爱上iPhone开发(2013球iOS7版)-第6篇1

    在本篇关于“让不懂编程的人爱上iPhone开发(2013球iOS7版)-第6篇1”的教程中,我们将探讨如何在Xcode中处理界面元素的初始化以及如何利用实例变量和属性来更好地管理代码。这部分内容主要涉及Xcode的使用、iOS应用...

    iPhone多视图开发案例图文步骤

    本文将详细介绍如何在iPhone项目中实现多个视图间的平滑切换,并通过实际案例来演示整个过程。 #### 二、准备工作 在开始之前,我们需要准备必要的开发工具和环境。本教程使用的是Xcode作为开发工具,它是一款专门...

    iphone开发快速入门[收集].pdf

    Objective-C 是苹果公司开发的一种面向对象的编程语言,主要用于iPhone、iPad等iOS设备的应用程序开发。它是基于标准的ANSI C,并在其基础上扩展了面向对象的功能。Objective-C 的语法受到Smalltalk的影响,同时兼容...

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

    Objective-C通过引入Smalltalk的影响,支持类、方法和属性等面向对象特性,使得程序员能够构建复杂的软件系统。 在Objective-C中,类是基本的构造单元,它们封装数据和操作数据的函数。类的定义分为接口(Interface...

    IOS开发书籍

    - **@synthesize指令**:自动为属性生成getter和setter方法。 ##### 第五部分:“如何处理UITableView中的行选择” - **关键技术点**: - **UITableViewDelegate**:提供了处理行选择的方法。 - **处理行选择**...

    iPhone 斯坦福大学教学课件

    - 学习关键字如`@interface`, `@implementation`, `@property`, `@synthesize`等的用法。 - 掌握动态类型和运行时机制在Objective-C中的作用。 2. **模型-视图-控制器(MVC)设计模式**: - MVC是iOS开发中广泛...

    iOS初级学习PDF

    - **Property和Outlet**:介绍了Objective-C中Property的概念以及如何使用IBOutlet连接视图元素与代码。 - **@synthesize指令**:讲解了如何使用@synthesize自动生成setter和getter方法,简化代码编写。 #### 五、...

    iOS笔试题.doc

    2. **@property 的作用是声明一个属性,@synthesize 的作用是自动生成 setter 和 getter 方法**。 - `@property` 是用来定义类的属性,它可以指定读写权限等特性。 - `@synthesize` 是用来告诉编译器自动生成属性...

    手把手教你使用xcode5 创建第一个iOS7应用 从第63页开始.pdf

    - **配置项目**:在创建项目过程中,需要填写项目名称、组织名称、公司标识符、设备方向(如iPhone、iPad)和使用的技术(Objective-C或Swift)。 - **设计用户界面**:使用Interface Builder来设计应用的用户界面。...

    object-c基础教程

    4. **实例变量(Instance Variables)**:用`@property`和`@synthesize`声明并生成访问器方法。 5. **方法声明和实现**:使用`-`(实例方法)和`+`(类方法)前缀。 6. **协议声明**:`@protocol`关键字定义协议,...

    一步一步学习ios5编程

    - **Property和Outlet**:在自定义的UITableViewCell子类中定义属性,并在Storyboard中建立与界面对象的连接。 - **@synthesize指令**:自动为属性生成getter和setter方法,简化代码。 - **更新...

    学习Objective-C: 入门教程

    Objective-C的语法结构包括类、消息、方法和属性等核心概念。类是Objective-C中的基本单元,用于定义对象的行为和状态。消息则是向对象发送指令的一种方式,类似于其他面向对象语言中的函数调用。方法是类中定义的...

    iOS OC 计算器

    通过`@property`关键字声明这些属性,并用`@synthesize`生成对应的getter和setter方法。 3. **方法**:`Calculator` 类需要实现基本的数学运算方法,如加法(`add:`),减法(`subtract:`),乘法(`multiply:`)和...

    The Objective-C Programming Language

    - **类**: 在Objective-C中,类是对象的模板或蓝图,定义了对象的属性和方法。 - **对象**: 对象是由类创建出来的实例。每个对象都有其自身的状态和行为。 **3. 方法** - **实例方法**: 由特定的对象实例调用的...

Global site tag (gtag.js) - Google Analytics