gpt4 book ai didi

objective-c - 类别可以访问在它扩展的类中定义的实例变量吗?

转载 作者:太空狗 更新时间:2023-10-30 03:50:28 28 4
gpt4 key购买 nike

我知道尝试将属性放在一个类别中并不是一个好主意。我可以从扩展类的类别中访问类的实例变量吗?或者是否有必要在被扩展的类上公开一个访问器?

例如,假设我有一个名为“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。假设(出于某种原因)我想将与一个人的 friend 打交道的所有操作分成一个类别,如下所示:

#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

最好不要暴露这个。

最佳答案

一般情况下,类别不能访问ivars;类扩展中的合成 ivar 和 ivar 在主要实现之外是私有(private)的和不可见的。

但是,您可以通过在其自己的私有(private) header 中的扩展中声明 ivar 并将该 header 导入到类别的实现文件中来做您想做的事。确保还将私有(private) header 导入到类的主要实现文件中。

关于objective-c - 类别可以访问在它扩展的类中定义的实例变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22441511/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com