创建一个 ivar ( NSMutableString ) 有效,但我收到警告



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

声明属性时 (@property NSMutableString *inputName;)我没有分配任何属性。但是如果我添加(强),我没有得到上述警告。当强是默认属性时,这怎么可能?以及给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;
}

__strong 是基础实例变量的默认值。如果您仅将实例变量声明为这样(例如,没有随附的属性)并且直接分配给ivar,则它应该在没有警告的情况下进行编译(尽管您会忽略最佳实践)。

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

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

最佳做法建议仅按属性访问 IVAR,并且属性表示适用于您的案例的正确内存管理原则。在这种情况下,在我看来,您的属性应该是(强的,非原子的)。

//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

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

最新更新