创建一个ivar(NSMutableString)工作,但我得到一个警告

时间:2012-05-08 16:52:28

标签: objective-c

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

2 个答案:

答案 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.