http://www.cnblogs.com/letmefly/archive/2012/07/20/2601338.html
一直有疑问,在objective_C中声明变量会有 2种方式,今天有空和网友讨论了下,并且自己查了stackoverflew后算是稍微弄懂了一点。记录如下:
用了一段oc;会发现有2种定义变量的方式
1.在 @interface :NSObject{} 的括号中,当然NSObject 是指一个父类,可以是其他的。
形式如下:
1 @interface GCTurnBasedMatchHelper : NSObject { 2 BOOL gameCenterAvailable; 3 BOOL userAuthenticated; 4 }
2.另外一种是直接在 @interface : NSObject{}括号之后,用 @property 去定义一个变量。
1 @property (assign, readonly) BOOL gameCenterAvailable;
你会发现,有人会再@interface中定义了变量后,又在 @property中重复定义相同的变量,而且很常见。
结果可能是这样:
1 @interface GCTurnBasedMatchHelper : NSObject { 2 BOOL gameCenterAvailable; 3 BOOL userAuthenticated; 4 } 5 6 @property (assign, readonly) BOOL gameCenterAvailable;
而且你可以单独在@interface中定义变量,而不用@property定义;也可以只用@property去定义,而不在@interface中定义,当然用了@property去定义,一般要在.m文件中用@synthsize去合成相应的setter,getter方法。否则会得到一个警告。当然@synthsize是可选的,但是是Apple推荐的,不用写的画,xcode4.2以后的版本会默认你写了@synthesize foo = _foo,给你自动生成一个带下划线的变量。
那这两种方式有什么区别呢。
1. 只在@interface中定义变量的话,你所定义的变量只能在当前的类中访问,在其他类中是访问不了的;而用@property声明的变量可以在外部访问。
2.用了@property去声明的变量,可以使用“self.变量名”的方式去读写变量。而用@interface的方式就不可以。
3. 这里给出一个链接:http://stackoverflow.com/questions/9702258/difference-between-properties-and-variables-in-ios-header-file 里面讲到: 我英语菜,简单翻一下:
Defining the variables in the brackets simply declares them instance variables.
在括号中定义一个变量只是简单的声明了一个实例变量(实例变量应该指的成员变量)。 博主注:老外对variable 和instance variable是有不同理解的。所以下文中 用了一个模糊的词 ivar。
Declaring (and synthesizing) a property generates getters and setters for the instance variable, according to the criteria within the parenthesis. This is particularly important in Objective-C because it is often by way of getters and setters that memory is managed (e.g., when a value is assigned to an ivar, it is by way of the setter that the object assigned is retained and ultimately released). Beyond a memory management strategy, the practice also promotes encapsulation and reduces the amount of trivial code that would otherwise be required.
声明(和 @synthsize)一个属性会为成员变量生成 getter 和setter方法,根据括号内的标准,在oc中经常用setter和getter 做内存管理,这是很重要的。(例如: 当一个值被赋给这个变量,对象是通过setter函数去分配,修改计数器,并最后释放的)。更高一个层次来说,这种做法也促进了封装,减少了一些不必要的代码。
It is very common to declare an ivar in brackets and then an associated property (as in your example), but that isn't strictly necessary. Defining the property and synthesizing is all that's required, because synthesizing the property implicitly also creates an ivar.
在@interface括号中定义一个变量并用@property 重复定义一次是很普遍的,实际上不是必要的。用@property和@synthszie就够了,因为在用@synthsize合成这个属性的读写方法时就会创建一个变量。
The approach currently suggested by Apple (in templates) is:
目前苹果(在模板中)建议的方法是这样的:
-Define property in header file, e.g.:
先在头文件中定义一个属性
1 @property int gameCenter;
Then synthesize & declare ivar in implementation:
然后在实现文件中 synthsize和declare成这样:
1 @synthesize gameCenter = __ gameCenter;
The last line synthesizes the gameCenter property and asserts that whatever value is assigned to the property will be stored in the __gameCenter ivar. Again, this isn't necessary, but by defining the ivar next to the synthesizer, you are reducing the locations where you have to type the name of the ivar while still explicitly naming it.
最后一行synthsize gameCenter 属性并说明了不管什么值被分配给这个属性,都会存储到_gameCenter这个变量中。 再次说明,这不是必要的,但是,这样写了之后,你能减少输入已经明确命名的变量名。
最后一句的意思you are reducing the locations where you have to type the name of the ivar while still explicitly naming it .不好翻。
据千锋的第2节语法课课程的讲解,这样写之后可以使得 @synthsize 时内部getter方法会展成
1 -(int)gameCenter 2 { 3 return _gameCenter; 4 }
而直接写 @synthsize gameCenter;
setter函数会在内部展开成
1 -(int)gameCenter 2 { 3 return gameCenter; 4 }
注意到:函数名和变量名是一样的。在斯坦福的课程中,白胡子教授也模糊的说道这样的同名有可能带来bug,具体什么bug他没说,我也没见过,所以还是养成这样写的习惯为好。其他语言的getter函数 一般会在变量前加 get;但oc没有,可能是为了与其他语言做区分,算是oc的特色,结果却带来这么个麻烦。
相关推荐
相信每个初学者对@property和@synthesize都感到非常的陌生,在此给大家分享下我的自己的理解,有不当之处,还望多多指教。详细说明文章在下面连接http://blog.csdn.net/comeontom/article/details/7455459
### iOS开发中属性property和synthesize详解 #### 一、引言 在iOS开发过程中,`@property` 和 `@synthesize` 是两个非常重要的概念。它们不仅简化了代码编写过程,提高了开发效率,还增强了程序的可维护性。本文将...
@property还可以与@synthesize关键字一起使用,但现代的Xcode版本默认已经为@property声明的属性自动生成了对应的实例变量和存取方法,所以我们通常不再需要显式地使用@synthesize。 此外,@property还支持更多的...
在iOS开发中,`@property` 是Objective-C中的一个关键字,用于声明类的实例变量(ivar)并自动合成存取方法(setter和getter)。通过使用`@property`,开发者可以方便地控制实例变量的访问权限、内存管理策略、线程...
@property (nonatomic, retain) NSMutableString *currentResult; @property (nonatomic, retain) NSMutableDictionary *map; @property (nonatomic, retain) NSMutableArray *list; -(NSMutableDictionary *)...
在Objective-C中,`@property` 是一种声明属性的关键字,它允许你在类接口中定义对象的特性,如...理解`@property` 和`@synthesize` 是学习Objective-C的重要部分,因为它们极大地简化了对象属性的管理和内存管理。
6. @property 和 @synthesize: - `@property` 是 Objective-C 的属性声明,它提供了自动内存管理、存取方法等特性。 - `@synthesize` 通常与 `@property` 一起使用,用于自动生成存取方法的实现。 7. categories...
在iOS开发中,了解`@property`和`ivar`的区别是非常基础且重要的。`@property`和`ivar`都是Objective-C中用于管理类实例变量的方式,但它们在使用上有所差异,提供了不同的功能和灵活性。 首先,`ivar`(实例变量)...
1. 使用@property和@synthesize声明一个成员变量,给其赋值是时要在前面加上"self.",以便调用成员变量的setmember方法。 直接调用成员变量并且给其赋值:member=[NSString stringWithFormat:@””];将不执行...
3. Xcode会自动生成对应的@property和@synthesize代码,用于声明和实现滑动条的属性。 4. 在CrazyDragViewController.h中,添加@property声明,确保在头文件中暴露slider属性。 通过这些步骤,我们不仅解决了初始化...
2. **语法结构**:Objective-C的语法有其独特性,比如它的方法定义和调用方式,以及在C语言基础上添加的“@”符号,如@property和@synthesize关键字。文档可能详细解释了这些语法元素的使用。 3. **Foundation框架*...
- 类成员变量:Objective-C 2.0以后,类成员变量通常使用下划线开头的小驼峰法,如`mDataArray`,并通过@property和@synthesize声明。 - 一般变量:如`ticketsArray`,遵循小驼峰法。 - 常量命名:常量通常以小写...
- **@property 和 @synthesize**:`@property` 用于声明属性,而 `@synthesize` 自动生成 getter 和 setter 方法。 - **属性修饰符**:`nonatomic` (无锁) 和 `atomic` (原子性) 控制属性访问方式;`readonly` 和 ...
9. **setter/getter**: `@property` 用于声明对象属性,`@synthesize` 自动生成对应的存取方法。 10. **protocol**: 协议定义了一组必须或可选的方法签名,实现了协议的类需要提供这些方法的实现。 11. **delegate...
在iOS开发中,Objective-C语言提供了@property关键字来声明属性,并且可以在属性声明时指定不同的内存管理行为,主要涉及到assign、retain和copy这三个关键字。为了深入理解这三者的区别,首先需要了解Objective-C的...
这里,`@interface`定义了类的接口,`@property`用于声明实例变量,并通过`@synthesize`自动生成getter和setter方法。 #### 三、Java与Objective-C的相似性与差异 ##### 3.1 相似性 - **面向对象**:两者都是面向...
"OC 协议(取值)"这个主题很可能指的是Objective-C中的协议(Protocol)特性和其与属性(Property)取值相关的概念。下面我们将深入探讨这两个核心知识点。 首先,我们来理解Objective-C中的“协议”。协议是...
在使用@property声明属性时,默认情况下,你需要提供这些属性的实例变量和内存管理方法(setter和getter)。但你也可以通过使用@sythesized关键字来告诉编译器你将手动实现这些方法。这经常用在当你需要自定义setter...