[英]issue with ivar
我将对UIToolbar进行子类化,因为我将在我的应用程序中重复使用它。 UIToolbar使用委托协议:
//
// UIToolbarCustom.h
//
#import <UIKit/UIKit.h>
@protocol UIToolbarCustomDelegate
@required
- (void)tab:(UIBarButtonItem *)sender;
- (void)ok:(UIBarButtonItem *)sender;
@end
@interface UIToolbarCustom : UIToolbar {
id <UIToolbarCustomDelegate> delegate;
}
@property (strong, nonatomic) id delegate;
@end
标准的iOS开发课程老师建议明确声明所有带下划线的ivars,例如:
@implementation UIToolbarCustom
@synthesize delegate = _delegate;
@end
但是,在此指定方案中,它给了我一个错误:
error: property 'delegate' attempting to use ivar '_delegate'...
如果使用以下代码,代码就可以正常工作:
@synthesize delegate = __delegate; or
@synthesize delegate;
这里发生了什么? UIToolbar类中是否有一个名为_delegate的私有实例变量?
UPDATE
感谢所有的澄清和提示,我学到了很多东西。 原来我是iOS开发的新手(这是我的第二个应用程序第二个版本,所以我想正确地做到= p)。 按照提示,我有了这个新的头文件:
//
// Toolbar.h
//
#import <UIKit/UIKit.h>
@protocol ToolbarDelegate
@required
- (void)tab:(UIBarButtonItem *)sender;
- (void)ok:(UIBarButtonItem *)sender;
@end
@interface Toolbar : UIToolbar
@property (strong, nonatomic) id delegate;
@end
笔记:
类前缀已删除。
委托声明已被删除(我使用的是ios委托教程代码,但是代码示例使用了需要声明的旧版xcode)。
合成被删除了,我也不知道我们不再需要合成属性。
PS:显然,代码不起作用,因为存在ivar问题。 我要更改其名称,所以我不需要合成它,也不确定是否要使用什么名称...
这里发生了什么? UIToolbar类中是否有一个名为_delegate的私有实例变量?
是的,这就是问题所在。 您需要为实例变量命名一个不同的名称。 __delegate
可以使用,或者您可以在名称前加上3个字母的前缀(请参阅最后一段)。
请注意,您已经将ivar声明为delegate
,然后在synthesize语句中告诉编译器使用_delegate
。 实际上,这意味着根本没有使用您的delegate
ivar。 无论如何,如果您是像在为iOS(而不是32位Mac)而编写的,则不需要在子类的@interface部分中使用显式的实例变量声明,因为编译器会自动为您。
最后,将自己的子类命名为以“ UI”开头的名称是一种不好的形式,因为UI前缀是为UIKit的类保留的。 您应该改用自己的3个字母的前缀,否则完全不加前缀。 问题是UIKit的未来版本可能会包含一个名为“ UIToolbarCustom”的类,而您的子类将与它发生冲突。
从去年开始,当Xcode 4.3发布时,您不需要合成属性。 它由编译器为您完成(生成一个ivar,并在其名称前添加一个下划线)。 这意味着您也不需要声明ivar。 如果这样做,请确保使用_delegate
以外的名称命名。
因此,您真正需要的只是这一行:
@property (strong, nonatomic) id<UIToolbarCustomDelegate> delegate;
更新 :请查看Andrew Madsen的完整回答 。 原来UIToolbar有自己的名为_delegate
的ivar。 谁知道!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.