【问题标题】:creating a ivar ( NSMutableString ) works but I get a warning创建 ivar ( NSMutableString ) 有效,但我收到警告
【发布时间】:2012-05-17 04:34:19
【问题描述】:

我创建了一个名为 Engine 的简单类,它有一个名为 inputName ( NSMutableString ) 的 ivar。属性已设置好,一切正常。当我创建名为 car 的 Engine 实例并设置 inputName 时,我收到以下警告: 将保留的对象分配给不安全的属性,分配后对象将被释放。 除消息外,car.inputName 已分配内存并正确初始化。

在声明属性时 (@property NSMutableString *inputName;) 我没有分配任何属性。但是,如果我添加(强),我不会收到上述警告。当 strong 是默认属性时,这怎么可能?以及给 car.inputName 一个字符串的最佳方法是什么。

#import "Engine.h"
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        Engine *car = [[Engine alloc]init];
        car.inputName = [[NSMutableString alloc]initWithString:@"Ford Escot"];
        // yellow warning:Assigning retained object to unsafe property, object will be released after assignment

    }
    return 0;
}

【问题讨论】:

  • 大概这是一个 ARC 项目?
  • @trojanfoe - 是的 - 这是一个 ARC 项目

标签: objective-c


【解决方案1】:

__strong 是底层实例变量的默认值。如果您只声明了您的实例变量(例如,没有附带属性)并直接分配给您的 ivar,它应该在没有警告的情况下编译(尽管您会忽略最佳实践)。

当你创建一个访问实例变量的属性时,默认的内存管理是assign,这是不安全的。

因此,当您在没有强引用的情况下创建属性,然后分配给它时,编译器会警告您,这是不安全的。

最佳实践建议您仅通过属性访问 ivars,并且属性表达了适合您的情况的正确内存管理原则。在这种情况下,在我看来,您的属性应该是(强的、非原子的)。

//h

@interface SomeClass
{
    Engine *__anEngine; // will be __strong
}

@property (nonatomic) Engine *anEngine; //will be assign

//m
Engine *car = [[Engine alloc] init];

__anEngine = car; //retained
self.anEngine = car; //not retained

【讨论】:

    【解决方案2】:

    strong 不是默认值。 assign is the default.

    【讨论】:

    • 谢谢吉姆。这就是为什么当我添加强属性时出现错误消息的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多