【问题标题】:arrow operator in objective-cObjective-C中的箭头运算符
【发布时间】:2012-12-04 21:09:12
【问题描述】:

我有一个问题,代码如下:

@interface MyFoo : NSObject {
    NSString *nameStr;
}
@end
@implementation MyFoo
- (id)init {
    self = [super init];
    if (self) {
        self->nameStr = [@"some value of the string that is set right into the private ivar" copy];
    }
    return self;
}
@end

问题是:忽略所有 C++ 规则,忽略内存转储漏洞,为什么我不应该使用这种箭头运算符语法? Apple 文档中是否有一条规则说它是不正确的,因为在未来的类可能与运行时中指向结构的指针等表示不同?

提前致谢!

【问题讨论】:

    标签: ios objective-c runtime


    【解决方案1】:

    self->someIvar 的用法与someIvar 相同。没有错,但也不需要。

    我唯一一次使用箭头符号是在 copyWithZone: 的实现中,所以我可以复制每个没有属性的 ivars。

    SomeClass *someCopy = ...
    someCopy->ivar1 = ivar1; // = self->ivar1
    someCopy->ivar2 = ivar2; // = self->ivar2
    

    你在哪里看到任何说你不应该使用这种箭头运算符语法的东西?

    【讨论】:

    • 使用self时的风格问题。访问 self 以外的对象实例的 ivars 时需要它。
    • 是的!许多人也喜欢在 ivar 变量下划线,以区分 ivar。
    • 从那些谴责他们但强迫自己适应的人那里得到它:下划线现在是 Apple 提倡的风格;忽略这一点,后果自负。回复:箭头取消引用,在历史上,Objective-C 对象显式地具有直接支持它们的结构(即,每个实例变量都有一个命名的结构成员,按照@interface 中声明的顺序),并且这种语法几乎继承自它。
    • 您不应该使用 -> 在极少数情况下进入另一个对象的 ivars(copyWithZone: 的实现大约是唯一的一个)。
    【解决方案2】:

    仅在 ivar 名称上使用箭头符号来访问属性并不能保证它们将被保留、分配或等等... 因为您是在直接访问 ivar 而不是调用和设置属性中使用的 ou getter 方法。

    例子:

    @interface MyFoo : NSObject {
    }
    @property(nonatomic,retain)  NSString *nameStr;
    @end
    @implementation MyFoo
    - (id)initWithString:(NSString *)name {
        self = [super init];
        if (self) {
            self->nameStr = name; // will not be retained
        }
        return self;
    }
    @end
    

    对于已经回答的 ivar 变量,没有任何问题。

    【讨论】:

    • 问题与属性无关。
    • 当然有,他是问使用箭头符号是否有问题,如果你在属性中使用它就有问题。
    • 他没有询问是否将其与属性一起使用。他询问是否将其与 ivars 一起使用。您不能将箭头用于属性,而将点用于属性。重读问题然后我的答案。不涉及属性。他也没有以任何方式询问内存管理。
    • @rmaddy 我明白了,我只是指出一些我认为重要的事情
    • @rm 它也与属性有关——因为属性的“自动合成”是 Obj-C 的默认行为。
    【解决方案3】:

    使用箭头表示法并没有错,使用箭头表示法和点表示法是有区别的。如果使用箭头运算符,则访问实例变量,如果使用点运算符,则访问属性.
    它不像 C 结构那样使用箭头符号来访问指向的结构的成员,并使用点符号来访问结构成员。 所以我会做一个有意义的例子:

    @property (nonatomic, strong) NSString *text;
    

    在 .m 文件中:

    - (void)setText:(NSString *)string {
        NSLog(@"Accessing property");
        self->text = string; // let's suppose that text is not synthesized
    }
    

    如果您使用点符号,那么您访问该属性,它会打印“访问属性”。但这与 C 结构语法无关。

    【讨论】:

    • "它不像 C 结构那样使用箭头符号访问指向的结构的成员。"实际上,这正是它的工作原理。 “……使用箭头符号和点符号是有区别的。”这与原始问题真的相关吗?
    • 我相信这是我的错,我的句子总是被误解,我应该指定一切。编辑。
    猜你喜欢
    • 1970-01-01
    • 2012-10-12
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多