NSString(指针/非指针)赋值或保留

qst*_*tar 2 objective-c

我有四个同一类的变种.

指针,非指针,分配与复制的混合.

使用每个案例有什么含义?

1)

@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, retain);
@end

2)

@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, assign);
@end

3)

@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, retain);
@end

4)

@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, assign);
@end

Bar*_*ark 9

1)

@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, retain);
@end
Run Code Online (Sandbox Code Playgroud)

您不能NSObjects在堆栈上分配或作为对象实例变量.在早期,Objective-C确实允许这样做,但它不再存在.此代码不正确.

2)

@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, assign);
@end
Run Code Online (Sandbox Code Playgroud)

您不能NSObjects在堆栈上分配或作为对象实例变量.在早期,Objective-C确实允许这样做,但它不再存在.此代码不正确.

3)

@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, retain);
@end
Run Code Online (Sandbox Code Playgroud)

您保留NSString实例的所有权,保证在保留该所有权时不会解除分配.由于NSMutableString是子类NSString,您可能在赋值时被赋予了可变字符串,因此其他代码可能会在您不知情的情况下修改字符串的值(除非您使用键值观察来观察这些更改).出于这个原因,通常适合使用copy语义,你打算举办一个不变的值的属性(NSString,NSData,NSArray,NSSet是我们共同的-虽然不是exaustive -犯罪嫌疑人).

4)

@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, assign);
@end
Run Code Online (Sandbox Code Playgroud)

没有保留字符串中的所有者权益,这意味着它可能会在没有您的知识的情况下解除分配.在引用计数环境中,这是委托属性的标准做法,因为保留它们可能会创建保留周期.负责取消分配字符串的代码必须在执行此操作之前将apple属性设置为nil(在重新计算的环境中).在GC环境中,如果你有一个__strong指针或者如果你的声明中有一个__weak指针则给你一个归零(在dealloc设置为0),你的赋值将使字符串保持活动状态.