OC中ios 协议中定义属性可以定义属性吗

OC中特性、静态成员(static)以及协议的基本知识
OC中特性、静态成员(static)以及协议的基本知识
&&&@property是一种新的编译器功能,表示声明了一个新对象的属性;存在于接口部分()。
&&&&&例如:;&表示某类的对象具有类型的属性,其名称为,&也就是;取代了(;这条语句。
&&&&@synthesize也是一中新的编译器功能,表示创建该属性的访问器;存在于实现部分(
&&&&&&&&&@synthesize&name;这行代码实现了对的设置和返回功能,因为编译器遇到;代码时编译器将输出和方法的已编译的代码。
&&&&&注意:特性的局限性:当对象方法中有多个“参数”的情况时不能用和实现。
Static:静态成员
&&&&&&在Objective-C&的语法中声明后的static静态变量在其他类中是不能通过类名直接访问的,它的作用域只能是在声明的这个.m文件中&。不过可以调用这个类的方法间接的修改这个静态变量的值。
&&&&&警告:&&static&写在interface外面编译是没有错误的,但是编译器会报警告,这么说这样的写法是不被编辑器认可的。
&&&&&&错误:static&写在interface里面会直接报错,显然这样的语法是不被认可的。
&&&&&&static关键字声明的变量必须放在implementation外面,或者方法中,如果不为它赋值默认为0,它只在程序开机初始化一次。
在Objective-C中如何实现像C++中那样的静态成员变量:
举例说明使用形式:
&&&&需要做的是在一个类A的implementation(.m或者.mm)文件中定义一个static变量,然后为A类定义静态成员函数(class&method,也就是类方法)来操作该变量。
这样在其它类中你就不需要创建A类的实例来对static变量进行访问。虽然该static变量并不是A类的静态成员变量,但是也算达到了同样的效果。static变量的作用域被限制在单一的文件中。代码可以如下所示:
//example.h&&&&&&
@interface&Example&:&NSObject&{&&&&&
-&(id)&&&&&&
+(int)instanceC&&&&&&&&&&
//example.m&&&&&&
&#import&&example.h&&&&&&&&&&&&
static&int&&&&&&&&&&&
@implementation&Example&&&&&&
-(id)init{&&&&&&
&&&&if(self&=&[super&init])&&&
&&&&{&&&&&&
&&&&&&&&count+=1;&&&&&&
&&&&}&&&&&&
&return&&&&&&&
}&&&&&&&&&&
+(int)instanceCount{&&&&&&
&&&&&return&&&&&&
}&&&&&&&&&&
&&&&&&&&上面的例子中你就可以通过[Example&instanceCount]对静态变量count进行访问,无须创建实例。
&&&&&&+(void)addCount&标志+号后不用创建这个对象通过类名可以直接调用这个静态方法。&而之前方法前用过的-号,标志-号后的方法必须通过本类的对象或者在本来中才可以使用。所以这个方法无需使用这个类的对象调用。
直接使用类名方可调用这个方法:
#import&&MyClass.h&
&static&int&sCount&&=&100;
&@implementation&MyClass&
&+(void)addCount&&&
&&&&&&sCount&++;&&
&&&&&&NSLog(@&静态整型变量的值为:%d&,&sCount);
&&一个子类只能继承一个父类,但子类可以使用多个协议。采用协议的方法是在类的声明中列出协议的名称,采用协议意味着你必须实现协议中的所有方法,否则会产生警告。
&&&例如:已经创建好了一个类,他继承的父类是,同时我也声明好了一个协议,则采用协议的形式如下::
&&&当采用多个协议时格式如下:
&&&&&&&&@interface&Gun:,,
&&内存管理:当你使用、或者方法获得一个对象时,该对象的保留计数器的值为,而且你要负责释放它(当然,如果有自动释放池就不用了)。
我的热门文章
即使是一小步也想与你分享OC属性_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
上传于|0|0|暂无简介
你可能喜欢您所在的位置: &
详解Objective-C中委托和协议
详解Objective-C中委托和协议
Objective-C委托和协议本没有任何关系,协议如前所述,就是起到C++中纯虚类的作用,对于“委托”则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可以实现委托。
Objective-C中委托和协议是本文要介绍的内容,委托和协议是两个概念,协议实际上相当于中的纯虚类的概念,只定义并只能由其它类来实现。而委托类似于Java中的接口。(Objective-C实现委托这种机制是利用协议来实现的,这种说法我现在认为是不对的,理由下述:)。
Objective-C委托和协议本没有任何关系,协议如前所述,就是起到中纯虚类的作用,对于&委托&则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可以实现委托。下面说明了实现方式:
定义一个类A:
@interface&A:NSObject &-(void) &@end &@implement&A &-(void)print{ &} &@end&
定义一个类B,在B中定义类A的实例为B中的成员变量:
@interface&B:NSObject{ &&&&&&&&A&*a_ &} &@end&
下面在mai()函数中实现委托机制:
void&main() &{ &B&*b=[[B&alloc]init]; &A&*a=[[A&alloc]init]; &b.a_delegate=a; &[b.a_delegate&print]; &}&
这样,最基本的委托机制就完成了,套用最通俗的一句解释:B需要完成一个print的操作,但他自己并没有实现这个操作,而是交给了A去完成,自己只是在需要时调用A中实现的print操作。
下面再写一种实现方式,这样方式更接近于我们通常见到的用协议还实现的方式:
我们还是定义一个类A:
@interface&A:NSObject{ &B&*b; &} &-(void) &@end &@implement&A &@synasize& &-(void)viewDidLoad{ &b=[[B&alloc]init]; &b.delegate=self; &} &-(void)print{ &NSLog(@&print&was&called&); &} &@end&
然后类B的定义改成如下所示:
@interface&B:NSObject{ &id&delegate &} &@propert(nonamtic,retain)&id& &@end &&现在我们不用main()函数,在B的实现部分来实现委托机制: &&@implement&B &-(void)callPrint{ &[self.delegate&print]; &} &@end&
上面这种实现方式和第一种其实是一样的,只是第一种是在第三方函数调用委托方法。delegate是id类型,本例中就是A类的一个实例,当然可以调用A类中的print。第二种方式不存在第三方函数,是在B类中调用 A类中的方法。或者说,B中需要print方法,自己不实现,让A来实现,自己调用 。
再接下来就是最常见的用协议实现委托的方式,说明如下:
protocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。
delegate-委托,顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让别人来处理。
当一个A view 里面包含了B view
b view需要修改a view界面,那么这个时候就需要用到委托了。
需要几个步骤
1、首先定一个协议
2、a view实现协议中的方法
3、b view设置一个委托变量
4、把b view的委托变量设置成a view,意思就是 ,b view委托a view办事情。
5、事件发生后,用委托变量调用a view中的协议方法
B_View.h: &@protocol&UIBViewDelegate&&@optional &-&(void)ontouch:(UIScrollView&*)scrollV&//声明协议方法 &@end &@interface&BView&:&UIScrollView&{ &id&&&_&//设置委托变量 &} &@property(nonatomic,assign)&id&&&_& &@end &B_View.mm: &@synthesize&_ &-&(id)initWithFrame:(CGRect)frame&{ &if&(self&=&[super&initWithFrame:frame])&{ &//&Initialization&code &_touchdelegate=nil; &} &return& &} &-&(void)&touchesBegan:(NSSet*)touches&withEvent:(UIEvent*)event &{ &[super&touchesBegan:touches&withEvent:event]; &if(_touchdelegate!=nil&&&&[_touchdelegate&respondsToSelector:&@selector(ontouch:)&]&==&true)& &[_touchdelegate&ontouch:self];&//调用协议委托 &} &&@end &A_View.h: &@interface&AViewController&:&UIViewController&&&&{ &BView&*m_BV &} &@end &A_View.mm: &-&(void)viewWillAppear:(BOOL)animated &{ &m_BView._touchdelegate&=&self;&//设置委托 &[self.view&addSubview:&m_BView]; &} &-&(void)ontouch:(UIScrollView&*)scrollView &{ &&&&//实现协议 &}&
小结:详解Objective-C中委托和协议的内容介绍完了,希望通过本本文的学习能对你有所帮助!【编辑推荐】【责任编辑: TEL:(010)】
关于&&&&的更多文章
8月第二周,开发者们每月必看的编程语言排行榜如期而至。在一周
微软的思路很明确。一个消费者需要拥有几款电子设备?
中秋已过,圆圆的月亮似乎是一个害羞的姑娘,带上了一
对于设计师来说,扁平化设计是一种实打实的设计风格,
本书是作者根据十年网站营销经验,特别是搜索引擎优化(SEO)实现营销方面的技术和实践总结。本书帮助读者建立搜索营销的概念,
Windows Phone专家
Android开发专家
51CTO旗下网站问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
#import &Foundation/Foundation.h&
@interface Person : NSObject
NSString *
这样就直接能使用p.name了。好像不需要如下定义:
#import &Foundation/Foundation.h&
@interface Person : NSObject{
NSString* _
NSString *
这两种方式有啥区别呢?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我的经验来说,建议是全部用property定义名字,这样能分清楚变量内存操作方式(多线程实在太少,可以忽略)。并且,对于我来说,这是更容易辨清全局变量的方法之一,在m文件中直接使用_name,可以快速理解这是全局变量。我认为,使用property来做全局变量是个非常好的习惯。另外,@freewolf这里讲到的synthesize其实可以省略。这里用一个简单的setter来举例。
#import &Foundation/Foundation.h&
@interface Person : NSObject
@property (nonatomic,retain) NSString *
#import "Person.h"
@implementation Person
//下一步可以省略
@synthesize name = _
-(void) setName:(NSString *)name
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
NSString *
// 这个等于下面的(编译器会自动帮你处理)
NSString *_
// (线程处理方式, 内存操作方式)
@property(atomic, copy)
NSString *
// 属性名对应的成员变量是
@synthesize _name =
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 AppiOS:OC在Category中使用@property定义属性 - 简书
iOS:OC在Category中使用@property定义属性
有时候写Category需要@property定义属性。这个时候就需要使用@dynamic来进行修饰。@dynamic是什么意思?@dynamic修饰就是表明这个属性需要程序员自己管理该属性的setter和getter方法这个时候就需要重写getter和setter方法了。
(简单粗暴)直接上代码
@interface UITableView (Extension) &TableViewDelegate&
@property (nonatomic, copy) NSString *
#import "UITableView+Extension.h"
// 定义一个指针
static const void *Name = &N
@implementation UITableView (Extension)
- (void)setName:(NSString *)name {
objc_setAssociatedObject(self, Name, name, OBJC_ASSOCIATION_COPY);
- (NSString *)name {
return objc_getAssociatedObject(self, Name);
有什么不明白的可以加我QQ交流:(加的时候请注明来自简书)
我要一步一步往上爬

我要回帖

更多关于 ios 协议定义属性 的文章

 

随机推荐