gpt4 book ai didi

ios - ivar 的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:18:43 26 4
gpt4 key购买 nike

我正在对 UIToolbar 进行子类化,因为我要在我的整个应用程序中重复使用它。 UIToolbar 使用委托(delegate)协议(protocol):

//
// 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

standford iOS 开发类(class)老师建议显式声明所有带有下划线前缀的ivars,例如:

@implementation UIToolbarCustom

@synthesize delegate = _delegate;

@end

但是,在这个指定的场景中,它给了我一个错误:

error: property 'delegate' attempting to use ivar '_delegate'...

如果我使用代码工作得很好:

 @synthesize delegate = __delegate; or
@synthesize delegate;

这是怎么回事? UIToolbar 类中是否有名为_delegate 的私有(private)实例变量?

更新

感谢你们所有的澄清和提示,我学到了很多东西。事实证明我是 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. 委托(delegate)声明已删除(我使用的是 ios 委托(delegate)教程代码,但代码示例使用较旧的 xcode 版本,其中需要声明)。

  3. synthesize 被移除了,我也不知道我们不再需要 synthesize 我们的属性了。

PS:很明显代码不行,因为ivar问题。我要更改它的名称,所以我不需要合成它,但不确定要使用什么名称...

最佳答案

What is going on here? Is there a private instance variable in the UIToolbar class named _delegate?

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

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

最后,将您自己的子类命名为以“UI”开头的东西是不好的形式,因为 UI 前缀是为属于 UIKit 的类保留的。您应该改用自己的 3 字母前缀,否则根本没有前缀。问题是 UIKit 的 future 版本可能会包含一个名为“UIToolbarCustom”的类,而您的子类会与它发生冲突。

关于ios - ivar 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14204534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com