【发布时间】:2014-04-21 21:35:14
【问题描述】:
我知道尝试将属性放在一个类别中并不是一个好主意。我可以从扩展它的类别中访问类的实例变量吗?或者是否有必要在被扩展的类上公开一个访问器?
例如,假设我有一个名为“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
请注意 ivar _friends。假设(出于某种原因)我想将处理一个人的朋友的所有操作分成一个类别,如下所示:
#import "Person.h"
@interface Person (Friends)
-(NSArray *)getFriends;
-(void)addFriend:(Person *)person;
-(void)removeFriend:(Person *)person;
@end
在Person(Friends) 类别中,编译器不会知道Person 的ivar _friends。
即
//Person.h
@interface Person
@property(nonatomic, strong) NSMutableArray *friends;
...
@end
最好不要暴露这个。
【问题讨论】:
-
“尝试将实例变量放在一个类别中并不是一个好主意” 这甚至是不可能的。类别不能声明存储,只能声明方法。您的代码似乎已经回答了您的问题。你能更清楚你在问什么吗?
-
@JoshCaswell 我指的是类别中的属性。这是可能的。对不起。我想知道一个类别应该如何访问成员数据。因此,从我的示例中,我希望能够从 Person 的“_friends”ivar 中添加/删除对象。但我宁愿不在 Person 公共标头中公开 _friends 。这有意义吗?
-
您可以访问post your own answer。请这样做,而不是将其添加到问题正文中。如果您认为这是最好的,您也可以将您的答案标记为已接受(更改复选标记不会伤害我的感受或任何事情)。
标签: objective-c visibility categories ivar