1. read/write attributes (readwrite/readonly)
The default value is readwrite, which indicates that the attribute can be read or assigned a value to the attribute variable. readonly indicates that the attribute variable can only be read.
2. Atomic attributes (atomicity/nonatomic)
In an atomic attribute, atomic is the default value, indicating that the attribute is atomic and supports concurrent multi-thread access (synchronization locks are added to the setter Implementation). The latter is non-atomic, it is suitable for improving efficiency in non-multi-threaded environments without adding synchronization locks.
3. Setter attributes (assign/retain/copy)
If the property is of the object type, you need to use the retain, assign, and copy parameters to indicate how the setter method holds the object internally. Here, retain is to increase the reference count and has a strong reference type. Assign is the direct value assignment of variables, weak reference type, and default value. Copy is to copy the setter parameter and then assign it to the member variable. If you do not give a way to hold objects, the compiler will give a warning.