举例讲解Objective-C中@property属性的用法
这篇文章主要介绍了Objective-C中@property属性的用法,包括@property的属性关键字的整理,需要的朋友可以参考下
学过c/c++的朋友都知道,我们定义struct/class的时候,如果把访问限定符(public,protected,private)设置为public的话,那么我们是可以直接用.号来访问它内部的数据成员的。比如
1 2 3 4 5 6 7 | //in Test.h class Test { 晋升述职报告public: int i; float f; }; |
| |
我在main函数里面是可以通过下面的方式来使用这个类的:(注意,如果在main函数里面使用此类,除了要包含头文件以外,最重要的是记得把main.m改成,否则会报一些奇怪的错误。所以,任何时候我们使用c++,如果报奇怪的错误,那就要提醒自己是不是把相应的源文件改成.mm后缀了。其它引用此类的文件有时候也要改成.mm文件)
1 2 3 4 5 6 | // Test test; test.i =1; test.f =2.4f; NSLog(@"Test.i = %d, Test.f = %f",test.i, test.f); |
| |
msie
但是,在objc里面,我们能不能这样做呢?请看下面的代码:(新建一个警示教育体会objc类,命名为BaClass)
复制代码 代码如下:
//in BaClass.h
@interface BaClass : NSObject{
@public
NSString *_name;
}
接下来,我们在里面:
复制代码 代码如下:
BaClass *ba= [[BaClass alloc] init];
ba.name =@"t ba name";
NSLog(@"ba class's name = %@", ba.name);
不用等你编译,xcode马上提示错误,请看截图:
请大家注意看出错提示“Property 'nam' not found on object of type BaClass*",意思是,BaClass这类没有一个名为name的属性。即使我们在头文件中声明了@public,我们仍然无法在使用BaClass的时候用.号来直接访问其数据成员。而@public,@protected和@private只会影响继承它的类的访问权限,如果你使用@private声明数据成员,那么在子类中是无法直接使用父类的私有成员的,这和c++,java是一样的。
既然有错误,那么我们就来想法解决啦,编译器说没有@property,那好,我们就定义property,请看代码:
复制代码 代码如下:
//in BaClass.h
@interface BaClass : NSObject{
@public
NSString *_name;
}
@property(nonatomic,copy) NSString *name;
//in BaClass.m
@synthesize name = _name;
现在,编译并运行,ok崛起的近义词,很好。那你可能会问了@prperty是不是就是让”."号合法了呀?只要定义了@property就可以使用.号来访问类的数据成员了?先让我们来看下面的例子:
复制代码 代码如下:
@interface BaClass : NSObject{
@public
NSString *_name;
}
//@property(nonatomic,copy) NSString *name;
-(NSString*) name;
-(void) tName:(NSString*)newName;
我把@property乳胶床垫品牌的定义注释掉了,另外定义了两个函数,name和tName,下面请看实现文件:
复制代码 代码如下:
//@synthesize name = _name;
-
(NSString*) name{
return _name;
}
-(void) tName:(NSString *)name{
未缴纳社保证明if (_name != name) {
[_name relea];
_name = [name copy];
}
}
现在,你再编译运行,一样工作的很好。why?因为我刚刚做的工作和先前声明@property所做的工作完全一样。@prperty只不过是给编译器看的一种指令,它可以编译之后为你生成相应的getter和tter方法。而且,注意看到面property(nonatomic,copy)括号里面这copy参数了吗?它所做的事就是
复制代码 代码如下:
嘴边有痣好吗
_name = [name copy];
如果你指定retain,或者assign,那么相应的代码分别是:
//property(retain)NSString* name;
_name = [name retain];德国代购
//property(assign)NSString* name;
_name = name;
其它讲到这里,大家也可以看出来,@property并不只是可以生成getter和tter方法,它还可以做内存管理。不过这里我暂不讨论。现在,@property大概做了件什么事,想必大家已经知道了。但是,我们程序员都有一个坎,就是自己没有完全吃透的东西,心里用起来不踏实,特别是我自己。所以,接下来,我们要详细深挖@property的每一个细节。
首先,我们看atomic 与nonatomic的区别与用法,讲之前,我们先看下面这段代码:
复制代码 代码如下:
@property(nonatomic, retain) UITextField *urName; //1
@property(nonatomic, retain,readwrite) UITextField *urName; //2