Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在协议中定义@property_Iphone_Objective C_Ios_Cocoa Touch - Fatal编程技术网

Iphone 在协议中定义@property

Iphone 在协议中定义@property,iphone,objective-c,ios,cocoa-touch,Iphone,Objective C,Ios,Cocoa Touch,我有许多UIViewController子类,我希望它们共享名为session的相同属性,该属性处理“已登录”状态 我知道我可以使用父类,但这是非常明确的,因此我想知道是否可以通过共享协议“强制”session属性 我从未见过协议中定义的显式属性(显然,您可以定义setter和getter),那么在协议中定义属性是一种可取的模式吗?您可以在协议中拥有属性,前提是符合协议的每个类都有相应的@synthesis,或者提供一个getter和setter。是的,使用协议可以添加属性: @protocol

我有许多
UIViewController
子类,我希望它们共享名为
session
的相同属性,该属性处理“已登录”状态

我知道我可以使用父类,但这是非常明确的,因此我想知道是否可以通过共享协议“强制”session属性


我从未见过协议中定义的显式属性(显然,您可以定义setter和getter),那么在协议中定义属性是一种可取的模式吗?

您可以在协议中拥有属性,前提是符合协议的每个类都有相应的
@synthesis
,或者提供一个getter和setter。

是的,使用协议可以添加属性:

@protocol MyProtocol <NSObject>

@property (nonatomic, retain) NSFoobar *baz;

@end
@protocol-MyProtocol
@财产(非原子,保留)NSFoobar*baz;
@结束
和〈代码〉@合成baz在采用此协议的每个类中(或者您可以使用
@optional
关键字将声明的属性标记为可选)

@property
也可以出现在协议或类别的声明中

在报告中说明。因此没有问题。

在.h文件中:

 @property(nonatomic,strong)UILabel *mylabel;
在.m文件中:

 @synthesize mylabel = _mylabel;
编译器将为mylabel创建getter和setter

Ex -> 

-(void)setMylabe:(UILabel *) mylabel { //setter


}

-(UIlabel*)mylabel { // getter


}

但是对于类类别,通常不能向类添加实例变量。协议也一样,但这意味着类将符合属性。为什么不使用协议呢?使用类别,我必须为每个类编写一个,使用协议,我只需合成声明的属性。@mAu:这是一个公平的问题。我重写了我的答案,提到了如何使用协议来实现这一点。