use*_*382 5 properties subclass objective-c
当我@property在没有声明ivars的情况下声明一个超类中的子类时,将其子类化并尝试使用_propertyName子类中的超类ivar()实现getter ,xcode调用一个错误说明Use of undeclared identifier '_propertyName'.
什么是符合最佳编程实践的解决方案?
我应该@synthesize propertyName = _propertyName在@implementation子类中还是
@interface SuperClass : AnotherClass
{
Type *_propertyName;
}
@property Type *propertyName;
@end
Run Code Online (Sandbox Code Playgroud)
编辑:
我确实理解属性的访问器方法的自动"综合"和编译器创建的"underbar ivars".
可以通过 接口或实现部分中SuperClass没有任何@synthesizeivars声明或声明来实现ivar .
进一步澄清我的案例:免责声明:内容被窃取的Alfie Hanssen代码块
@interface SuperViewController : UIViewController
@property (nonatomic, strong) UITableView * tableView; // ivar _tableView is automatically @synthesized
@end
#import "SuperViewController.h"
@interface SubViewController : SuperViewController
// Empty
@end
@implementation SubViewController
- (void)viewDidLoad
{
NSLog(@"tableView: %@", self.tableView); // this is perfectly OK
}
// ************* This causes problem **************
- (UITableView *) tableView {
if (!_tableView) { // Xcode error: Use of undeclared identifier '_propertyName'
_tableView = [[SubclassOfUITableView alloc] init];
}
return _tableView;
}
// ************************************************
@end
Run Code Online (Sandbox Code Playgroud)
如果要在超类和子类中都使用ivar,则必须在超类的接口中声明它,因为它是两个实现中包含的唯一文件.否则,你只是想猜测超类的实现可能会有什么,而xcode不会玩游戏.
以上是否存在使用该ivar的属性.
现在,如果您在超类中有一个属性,并且您在子类实现中写入:
@synthesize propertyName = _propertyName
Run Code Online (Sandbox Code Playgroud)
你只是说你放弃了超类中该属性的任何实现,你想要xcode生成的标准setter和getter,工作在一个名为_propertyname的ivar上.也许超类的工作方式相同,也许不是.
| 归档时间: |
|
| 查看次数: |
4365 次 |
| 最近记录: |