可以在类扩展中定义的类访问实例变量吗?

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)

最好不要揭露这一点.

Jos*_*ell 5

一般来说,类别无法访问ivars; 从类扩展中合成的ivars和ivars在主要实现之外是私有的和不可见的.

但是,您可以通过在其自己的私有标头中的扩展中声明ivar并将该标头导入类别的implmentation文件来执行您想要的操作.确保还将私有标头导入到类的主实现文件中.