繁体   English   中英

伊瓦尔的问题

[英]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

笔记:

  1. 类前缀已删除。

  2. 委托声明已被删除(我使用的是ios委托教程代码,但是代码示例使用了需要声明的旧版xcode)。

  3. 合成被删除了,我也不知道我们不再需要合成属性。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM