Objective-c 现代运行时在接口块中使用属性和 ivars

发布于 2024-11-09 05:18:15 字数 562 浏览 4 评论 0原文

我看过代码示例(来自《Beginning iPhone 4 Development》一书),其中它们都在接口块内声明 ivars,然后声明相同的属性。像这样:

@interface ViewController : UIViewController {
    UITableView *table;
}

@property (nonatomic, retain) IBOutlet UITableView *table;

这样做的目的/好处是什么?据我了解,使用现代运行时版本(iPhone 和 64 位 OS X 应用程序),您只需要声明属性,并且可以省略在接口块内声明 ivars。根据 这个在类似线程中的答案将用于调试目的。但是,除了调试之外,您使用这种方法还有其他好处吗?

干杯,

彼得

I've seen code examples (from the book Beginning iPhone 4 Development) where they both declare ivars inside the interface block and then declare properties for the same. Like this:

@interface ViewController : UIViewController {
    UITableView *table;
}

@property (nonatomic, retain) IBOutlet UITableView *table;

What would be the purpose/benefit of this? As I understand that with the modern runtime version (iPhone and 64-bit OS X applications) you only need to declare properties and can leave out declaring the ivars inside the interface block. According to this answer in a similair thread it would be for debugging purposes. But are there any other benefits except for debugging that you would use this approach?

Cheers,

Peter

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

风吹短裙飘 2024-11-16 05:18:15

显式声明 ivars 使您可以在内部使用 ivar 的专用类型。

一个典型的例子是内部可变的对象,可以以只读、不可变的方式从外部访问。

示例:

@interface Foo : NSObject
@property (readonly) NSArray *bars;
@end

@implementation
{
    NSMutableArray *bars;
}

@synthesize bars;

- (void)addBar:(Bar *)bar
{
    [bars addObject:bar];
}
@end

当然,从 bars 属性返回的对象并不是真正不可变的。但重点是 API 并没有透露它的可变性。

请注意,我使用了新奇的 private-ivars-in-implementation 风格。它取决于现代运行时以及 clang 编译器。

Explicitly declaring ivars gives you the possibility to internally use a specialized type for the ivar.

A typical example is an internally mutable object that can be accessed from outside in a readonly, immutable way.

Example:

@interface Foo : NSObject
@property (readonly) NSArray *bars;
@end

@implementation
{
    NSMutableArray *bars;
}

@synthesize bars;

- (void)addBar:(Bar *)bar
{
    [bars addObject:bar];
}
@end

Of course the object returned from the bars property is not really immutable. But the point is that the API does not reveal its mutability.

Note that I used the fancy new private-ivars-in-implementation style. It's depending on the modern runtime as well as the clang compiler.

软甜啾 2024-11-16 05:18:15

一些程序员喜欢用稍微不同的名称来定义他们的 iVar,以区分直接访问和 KVC 访问。例如:

在 .h

@interface ViewController : UIViewController {
    UITableView *_table;
}

@property (nonatomic, retain) IBOutlet UITableView *table;

和 .m

@synthesize table = _table;

中,您可以使用 _table 直接访问 iVar,但可以使用 [self table] 使用合成的 setter 和 getter

Some programmers like to define their iVars with a slightly different name to differentiate between direct access and KVC access. For example:

in the .h

@interface ViewController : UIViewController {
    UITableView *_table;
}

@property (nonatomic, retain) IBOutlet UITableView *table;

and in the .m

@synthesize table = _table;

this way you directly access the iVar using _table but you use the synthesized setters and getters using [self table]

阳光的暖冬 2024-11-16 05:18:15

但是除了调试之外,您使用这种方法还有其他好处吗?

我明确声明 ivars 是为了:

  • 访问控制(可见性)
  • 组织
  • 统一的书面风格
  • 兼容性(嘿,这个程序有一天可以支持 32 位)
  • 并且因为我将属性关联为类公共接口的一部分(尽管存在例外)-不仅仅是作为类的 ivars 的访问者。

“一切都是读/写属性”从根本上来说是有缺陷的。

But are there any other benefits except for debugging that you would use this approach?

i declare the ivars explicitly for:

  • access control (visibility)
  • organization
  • uniform written style
  • compatibility (hey, this program could support 32 bit one day)
  • and because i associate properties as a part of the class's public interface (although exceptions to this exist) - not simply as accessors to the class's ivars.

"everything as a read/write property" is fundamentally flawed ood.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文