我创建了一个名为Engine的简单类,它有一个名为inputName(NSMutableString)的ivar。属性已经设置,一切正常。当我创建和引擎实例名为car并设置inputName时,我收到以下警告: 将保留对象分配给不安全属性,对象将在分配后释放。 除了消息之外,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;
}
答案 0 :(得分:2)
__ 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
答案 1 :(得分:1)
strong
不是默认值。 assign
is the default.