Nic*_*ick 5 visibility objective-c categories ivar
我知道尝试将属性放在一个类别中并不是一个好主意.我可以从扩展它的类别中访问类的实例变量吗?或者是否有必要在正在扩展的类上公开访问器?
例如,假设我有一个名为"Person"的类,其实现如下所示:
#import "Person.h"
@interface Person()
{
NSMutableArray *_friends;
}
@end
@implementation Person
- (instancetype)init
{
self = [super init];
if (self) {
_friends = [NSMutableArray array];
}
return self;
}
-(instancetype)initWithFirstname:(NSString *)firstName lastname:(NSString *)lastName
{
self = [self init];
if (self) {
_firstName = firstName;
_lastName = lastName;
}
return self;
}
-(NSString *)getFullName{
return [NSString stringWithFormat:@"%@ %@", _firstName, _lastName];
}
@end
Run Code Online (Sandbox Code Playgroud)
注意ivar _friends.让我们说(由于某种原因或其他原因)我想将处理一个人朋友的所有操作分成一个类别,如下所示:
#import "Person.h"
@interface Person (Friends)
-(NSArray *)getFriends;
-(void)addFriend:(Person *)person;
-(void)removeFriend:(Person *)person;
@end
Run Code Online (Sandbox Code Playgroud)
在类别中,Person(Friends)编译器不会知道Personivar _friends.
即
//Person.h
@interface Person
@property(nonatomic, strong) NSMutableArray *friends;
...
@end
Run Code Online (Sandbox Code Playgroud)
最好不要揭露这一点.
一般来说,类别无法访问ivars; 从类扩展中合成的ivars和ivars在主要实现之外是私有的和不可见的.
但是,您可以通过在其自己的私有标头中的扩展中声明ivar并将该标头导入类别的implmentation文件来执行您想要的操作.确保还将私有标头导入到类的主实现文件中.
| 归档时间: |
|
| 查看次数: |
3417 次 |
| 最近记录: |