0

我创建了一个名为 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;
}
4

2 回答 2

2

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

在创建访问实例变量的属性时,默认的内存管理是分配的,这是不安全的。

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

最佳实践建议您仅按属性访问 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
于 2012-05-08T17:07:30.397 回答
1

strong不是默认值。 assign是默认值。

于 2012-05-08T17:04:26.603 回答