与伊娃问题

lol*_*lol 2 cocoa-touch ios

我正在为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
Run Code Online (Sandbox Code Playgroud)

Standford iOS开发课程老师建议明确声明所有ivars前缀为下划线,如:

@implementation UIToolbarCustom

@synthesize delegate = _delegate;

@end
Run Code Online (Sandbox Code Playgroud)

但是,在这个指定scenarion它给我一个错误:

error: property 'delegate' attempting to use ivar '_delegate'...
Run Code Online (Sandbox Code Playgroud)

如果我使用以下代码就可以了:

 @synthesize delegate = __delegate; or
 @synthesize delegate;
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?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
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 类前缀已删除.

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

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

PS:显然代码不起作用,因为ivar问题.我要更改它的名字,所以我不需要合成它,不知道要使用什么名称...

And*_*sen 5

这里发生了什么?UIToolbar类中是否有一个名为_delegate的私有实例变量?

是的,这正是问题所在.您需要为实例变量提供不同的名称.__delegate将起作用,或者您可以在名称前加上3个字母的前缀(参见最后一段).

请注意,您已将ivar声明为delegate,然后在synthesize语句中告诉编译器使用_delegate.实际上,这意味着您的delegateivar根本就没有被使用.无论如何,如果您正在为iOS编写(而不是32位Mac),就像您一样,在子类的@interface部分中不需要显式的实例变量声明,因为编译器会自动为它创建它您.

最后,将自己的子类命名为以'UI'开头的形式是不好的,因为UI前缀是为属于UIKit的类保留的.您应该使用自己的3个字母前缀,否则根本没有前缀.问题是,UIKit的未来版本可能包含一个名为"UIToolbarCustom"的类,您的子类将与它发生冲突.

  • 再说一次,那不是真的.并且,如果您不相信可以与私有/内部Apple ivar发生冲突,请尝试继承UIViewController并使用名为`_popoverController`的支持ivar创建名为`popoverController`的属性.你会得到OP描述的确切错误.通过查看UIToolbar.h可以看到,UIToolbar确实有自己的实例变量`_delegate`. (2认同)