gpt4 book ai didi

Objective-C,带有属性的接口(interface)声明

转载 作者:太空狗 更新时间:2023-10-30 03:59:07 28 4
gpt4 key购买 nike

在下面的常见示例中,

////
@interface MyObject : NSObject
{
@public
NSString * myString_;
}

@property (assign) NSString * myString;
@end

@implementation MyObject
@synthesize myString = myString_;
@end
////

为什么要在接口(interface)中声明 myString_

我问是因为我们仍然可以在实现中使用 self.myString[self myString] 获取和设置 myString self.myString = ...[self setMyString:...] 事实上我们必须保留它。

最佳答案

这是某些人的偏好/惯例问题。默认情况下,做:

@property (assign) NSString * myString;

...接着是:

@synthesize myString;

...会给你三样东西。你得到一个 setter 方法,可以作为 self.myString = @"newValue"[self setMyString:@"newValue"] 访问,一个可以访问的 getter 方法作为 NSString* temp = self.myStringNSString* temp = [self myString],以及一个可以直接访问的名为 myString 的实例变量在您的类内部(即不通过 getter 和 setter)并用于设置和获取属性值,并在内部用于支持属性。

如果你愿意,你可以做 @synthesize myString = someOtherVarName,然后你仍然像以前一样获得 setter 和 getter,但不是 myString 实例变量someOtherVarName 实例变量用于支持属性,没有创建 myString 变量。

那么为什么要使用更冗长的语法呢?从来没有任何情况要求您这样做,但有些人在处理声明为 retaincopy 的属性时更喜欢这样做。原因是通过其生成的 setter 方法设置声明为 retaincopy 的属性将影响正在设置/取消设置的对象的保留计数。通过直接访问实例变量来做同样的事情不会。

因此,通过将实例变量别名化为其他变量,您可以在代码中区分“任何执行 xxx.myString = Y 的操作都在修改保留计数,而任何执行someOtherVarName = Y 不是”。同样,没有必要这样做,但有些人更喜欢这样做。

关于Objective-C,带有属性的接口(interface)声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6448443/

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