NSString (pointer/non pointer) assign or retain
我有四个相同的班。
指针、非指针、赋值与复制的组合。
使用每个案例的含义是什么?
1)
1 2 3 4 5 | @interface fruit:NSObject{ NSString apple; } @property(nonatomic, retain); @end |
2)
1 2 3 4 5 | @interface fruit:NSObject{ NSString apple; } @property(nonatomic, assign); @end |
3)
1 2 3 4 5 | @interface fruit:NSObject{ NSString *apple; } @property(nonatomic, retain); @end |
4)
1 2 3 4 5 | @interface fruit:NSObject{ NSString *apple; } @property(nonatomic, assign); @end |
1)
1 2 3 4 5 | @interface fruit:NSObject{ NSString apple; } @property(nonatomic, retain); @end |
不能在堆栈上或作为对象实例变量分配
2)
1 2 3 4 5 | @interface fruit:NSObject{ NSString apple; } @property(nonatomic, assign); @end |
不能在堆栈上或作为对象实例变量分配
3)
1 2 3 4 5 | @interface fruit:NSObject{ NSString *apple; } @property(nonatomic, retain); @end |
您保留了
4)
1 2 3 4 5 | @interface fruit:NSObject{ NSString *apple; } @property(nonatomic, assign); @end |
您没有保留字符串中的所有权权益,这意味着它可能在您不知情的情况下被解除。在引用计数环境中,这是委托属性的标准实践,因为保留它们可能会创建一个保留周期。负责解除分配字符串的代码必须在执行此操作之前(在引用计数的环境中)将apple属性设置为nil。在GC环境中,如果您的声明中有一个弱指针,那么您的分配将使字符串保持活动状态;如果您的声明中有一个弱指针,那么您的分配将使字符串保持零位(在dealloc中设置为0)。
据我所知,您应该始终使用NScReST保留或复制。指针(4)上的赋值将不会增加引用计数,因此将泄漏内存,或者说,这意味着当计数过早达到0时,最终会访问已释放的内存。
我不知道您是否可以使用nsstring作为本机类型。我总是用它作为指针。