objective-c - 是否可以在子类中重新声明私有(private) ivar 以使其可访问?

标签 objective-c cocoa-touch cocoa subclass foundation

当对在 .h 文件中列出私有(private) ivar 的 Apple 类进行子类化时,是否可以在子类 .m 文件内的类扩展 @interface 中重新声明您自己的子类中的那些 ivar,以便您的子类可以访问它们实现?

最佳答案

您必须记住,在子类中声明实例变量不会重新声明具有相同名称的现有父类(super class)实例变量,无论声称的重新声明是在公共(public)接口(interface)还是类扩展中.即使您使用相同的名称,它也是一个不同的实例变量

你可以自己试试。例如:

@interface Base : NSObject {
@private
    int _number;
}
@end

@implementation Base
- (id)init { self = [super init]; if (self) _number = 10; return self; }
- (void)logNumber { printf("base = %d\n", _number); }
@end

@interface Derived : Base
@end

@interface Derived () {
    int _number;
}
@end

@implementation Derived
- (id)init { self = [super init]; if (self) _number = 20; return self; }
- (void)logNumberDerived { printf("derived = %d\n", _number); }
@end

int main(void) {
    Derived *o = [Derived new];
    [o logNumber];
    [o logNumberDerived];
    return 0;
}

输出:

base = 10
derived = 20

因为父类(super class)中的_number 与子类(扩展)中的_number 不同。如果您使用 nm -a 检查二进制输出中的符号,您会注意到编译器生成了两个不同的符号:

s _OBJC_IVAR_$_Base._number
s _OBJC_IVAR_$_Derived._number

关于objective-c - 是否可以在子类中重新声明私有(private) ivar 以使其可访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17187651/

相关文章:

objective-c - 从另一个类获取整数值

objective-c - BarButtonItem 因未知原因调整大小

objective-c - 调整 UITableViewCell 的 contentView 大小时 UILabel 的过渡效果

cocoa - 显示 NSOpenPanel 时设置AllowedFileTypes

cocoa - XCode 3.2.3 中的绑定(bind)

iOS 7 - 在 ViewController 之间传递数据(图像)

ios - 为什么 Apple 决定在 iOS 9.0 中弃用 UIAlertView 的大部分方法?

iphone - 如何获得自己的电话号码?

ios - 在“init”中初始化的对象无法在“viewDidLoad”中访问

objective-c - 使用 NSTask 将数据传递到工具的标准输入